pyqtgraph issue #1102 <https://github.com/pyqtgraph/pyqtgraph/issues/1102>
On Monday, February 1, 2021 at 11:28:10 AM UTC-5 [email protected] wrote: > I'm starting to think my problem is with the version of PySide2 on my > conda environment. I went to compare pyqtgraph.Qt.loadUiType with > PySide2.QtUiTools.loadUiType. It's not there: > > from PySide2.QtUiTools import loadUiType > Traceback (most recent call last): > File "C:\Program Files\JetBrains\PyCharm Community Edition > 2020.1\plugins\python-ce\helpers\pydev\_pydevd_bundle\pydevd_exec2.py", > line 3, in Exec > exec(exp, global_vars, local_vars) > File "<input>", line 1, in <module> > ImportError: cannot import name 'loadUiType' from 'PySide2.QtUiTools' > (D:\anaconda3\envs\fieldcapenv_pyside\lib\site-packages\PySide2\QtUiTools.cp37-win_amd64.pyd) > > PySide2.__version__ > '5.13.2' > > I need to be at 5.14. > On Monday, February 1, 2021 at 9:07:27 AM UTC-5 [email protected] wrote: > >> Patrick, >> >> (Commenting embedded in your reply) >> >> On Sunday, January 31, 2021 at 8:31:17 PM UTC-5 Patrick wrote: >> >>> It could be that with this code: >>> >>> Template, BaseClass = pg.Qt.loadUiType(uifilename.as_posix()) >>> self.FileNamingWidget = Template() >>> widget = BaseClass() >>> self.FileNamingWidget.setupUi(widget) >>> >>> then "self.FileNamingWidget" and "widget" are different objects, while >>> defining a new class with: >>> >>> class DataPanel(QtWidgets.QWidget, loadUiType(__file__.split(".py")[0] + >>> ".ui")[0]): >>> >>> then an instance of DataPanel is both a subclass of QWidget *and* >>> whatever loadUiType()[0] returns through multiple inheritance. The type >>> returned by the loadUiType(...)[0] magic lets the QWidget use the setupUi() >>> method as if it were "derived from user interface descriptions created >>> using uic" as described in the QWidget.setupUi() method documentation. >>> >>> >> The __file__.split(".py")[0] + ".ui")[0]) is what threw me on my >> misunderstanding on using pysideuic. Your >> loadUiType(__file__.split(".py")[0] >> + ".ui")[0] is basically my Template, and I think your QtWidgets.QWidget is >> my BaseClass >> >> I was trying to follow the examples on loadUiType() that returns a form >> and base class and trying also to use pyqtgraph's Qt.py to handle >> supporting PyQt5 and PySide2. My MainWIndow gets created fine following the >> designerExample.py >> <https://github.com/pyqtgraph/pyqtgraph/blob/master/examples/designerExample.py> >> : >> >> with importlib.resources.path('nvfieldcap.resources.ui', 'NVFieldCap.ui') >> as uiFile: >> WindowTemplate, TemplateBaseClass = pg.Qt.loadUiType(uiFile.as_posix()) >> >> class MainWindow(TemplateBaseClass): >> >> def __init__(self, config=None): >> TemplateBaseClass.__init__(self) >> # Create the main window >> self.ui = WindowTemplate() >> self.ui.setupUi(self) >> >> (uiFileName = 'FileNamingWidget.ui' ) >> uiFileName = self.get_uiFileName(config) >> with importlib.resources.path('nvfieldcap.resources.ui', uiFileName) as >> uifilename: >> if 'PySide2' in sys.modules: >> Template, BaseClass = pg.Qt.loadUiType(uifilename.as_posix()) >> >> Template and BaseClass are both classes >> Template,BaseClass >> (<class 'Ui_Filename_Folder_Widget'>, <class >> 'PySide2.QtWidgets.QTabWidget'>) >> Looking at your code again though, I think I should be doing something >> like >> >> Template, BaseClass = >> QtWidgets.QTabWidget.loadUiType(uifilename.as_posix()) >> >> My "FileNamingWidget.ui" file starts with: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <ui version="4.0"> >> <class>Filename_Folder_Widget</class> >> <widget class="QTabWidget" name="Filename_Folder_Widget"> >> >> *Ok, so QTabWidget doesn't have a loadUiType(). Scratch that.* I'm >> reading this uifile inside my MainWIndow.__init__ , so I don't know what my >> class is yet. (Well, I guess I do know it's a QTabWidget.) >> >> And no, I don't use the command line uic/pysideuic tools to generate >>> python files from the .ui, I just build them in QtDesigner and use the >>> loadUiType(...) method. If I have a subwidget which is inserted >>> programmatically into a larger form, then I'll have a small class >>> definition though. So something like this: >>> >>> from PySide2 import QtCore, QtGui, QtWidgets >>> from PySide2.QtUiTools import loadUiType >>> >>> class MainPanel(QtWidgets.QWidget, loadUiType("mainpanel.ui")[0]): >>> def __init__(self, parent=None): >>> super().__init__(parent) >>> self.setupUi(self) >>> # ... >>> self.subPanel = SubPanel() >>> self.layout().addItem(self.subPanel) >>> # ... >>> # dynamic ui setup for SubPanelWidget, connect signals etc >>> # ... >>> class SubPanel(QtWidgets.QFrame, loadUiType("subpanel.ui")[0]): >>> def __init__(self, parent=None): >>> super().__init__(parent) >>> self.setupUi(self) >>> # ... >>> # other boilerplate ui setup for SubPanelWidget >>> >>> It's not as nice as being able to use the uic.load() method, but this >>> was the first/only way I got dynamic ui loading with PySide2, so stopped >>> messing around trying to figure out why load() was giving so much trouble. >>> >>> >> I'll look over this more and see if I can follow your pattern. Thanks. >> >> >>> (snip) >>>>>>>> >>>>>>>> TIm >> >> >> > -- You received this message because you are subscribed to the Google Groups "pyqtgraph" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/pyqtgraph/2db65699-7066-4807-985e-d1bdec077998n%40googlegroups.com.
