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/ca3d8d28-023a-4e14-a65a-a41821eb2e40n%40googlegroups.com.