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.
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.
On Monday, 1 February 2021 at 3:56:55 am UTC+10:30 [email protected] wrote:
> So why doesn't this work as I expect?
>
> Template, BaseClass = pg.Qt.loadUiType(uifilename.as_posix())
> self.FileNamingWidget = Template()
> widget = BaseClass()
> self.FileNamingWidget.setupUi(widget)
>
> When I try to add self.FileNamingWidget to my layout, I get an error.
>
> self.ui.PluginLayout.addWidget(self.FileNamingWidget)
> 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>
> File
> "D:\anaconda3\envs\fieldcapenv_pyside\lib\site-packages\pyqtgraph\widgets\LayoutWidget.py",
>
> line 74, in addWidget
> self.layout.addWidget(item, row, col, rowspan, colspan)
> TypeError: 'PySide2.QtWidgets.QGridLayout.addWidget' called with wrong
> argument types:
> PySide2.QtWidgets.QGridLayout.addWidget(Ui_Filename_Folder_Widget, int,
> int, int, int)
> Supported signatures:
> PySide2.QtWidgets.QGridLayout.addWidget(PySide2.QtWidgets.QWidget, int,
> int, PySide2.QtCore.Qt.Alignment = Default(Qt.Alignment))
> PySide2.QtWidgets.QGridLayout.addWidget(PySide2.QtWidgets.QWidget, int,
> int, int, int, PySide2.QtCore.Qt.Alignment = Default(Qt.Alignment))
> PySide2.QtWidgets.QGridLayout.addWidget(PySide2.QtWidgets.QWidget)
>
> self.FilenamingWidget is a
> <Ui_Filename_Folder_Widget object at 0x000001DAF81762C8>
>
> but if I use loader.load(), it is
> loader.load(uifilename.as_posix())
> <PySide2.QtWidgets.QTabWidget(0x1dafaf6c200,
> name="Filename_Folder_Widget") at 0x000001DAFC3179C8>
>
> and I can add this to my Layout. I get the same error under PyQt5 with
> loadUiType, but uic.loadUi() works fine.
>
> self.FileNamingWidget
> Out[4]: <Ui_Filename_Folder_Widget at 0x22a97fa9c88>
> uic.loadUi(uifilename.as_posix())
> Out[3]: <PyQt5.QtWidgets.QTabWidget at 0x22a999fd9d8>
>
> On Sunday, January 31, 2021 at 11:05:40 AM UTC-5 [email protected] wrote:
>
>> Well, that didn't work.
>>
>> I guess I have figure out how to properly use pg.Qt.loadUiType().
>> ----
>> Tim Williams
>>
>>
>> On Sun, Jan 31, 2021 at 10:39 AM Tim Williams <[email protected]> wrote:
>>
>>> Thanks Patrick,
>>>
>>> I already have a Ui file from Designer. If I understand correctly, it
>>> looks like you're basically doing the reverse of what pysideuic does, that
>>> is to take a .py file and create al .ui and then do a loadUiType().
>>> Your <customwidgets> section did prompt me to look at that section in my
>>> Ui file.
>>>
>>> <customwidgets>
>>> <customwidget>
>>> <class>LayoutWidget</class>
>>> <extends>QWidget</extends>
>>> <header>pyqtgraph</header>
>>> <container>1</container>
>>> </customwidget>
>>> </customwidgets>
>>>
>>> I noticed that the Designer showed my ParameterTree as unused. (I'm not
>>> sure where that came from.I edited that file, then used Git to get it back
>>> to before I edited it, and Designer is not showing that message anymore)
>>> My ParameterTree is actually added in to my main to a Layout from
>>> another Ui file that does have ParameterTree as a promoted widget.
>>>
>>> (in parametertreeDialog.ui:)
>>> <customwidgets>
>>> <customwidget>
>>> <class>ParameterTree</class>
>>> <extends>QTreeWidget</extends>
>>> <header>pyqtgraph.parametertree</header>
>>> </customwidget>
>>> </customwidgets>
>>>
>>> This is part of a QDialog that I pop up when I want to change or view
>>> the parameters. I think I need to add
>>> <customwidget>
>>> <class>ParameterTree</class>
>>> <extends>QTreeWidget</extends>
>>> <header>pyqtgraph.parametertree</header>
>>> </customwidget>
>>>
>>> to my main Ui file even though the widget
>>>
>>> I do use pyqtgraph.Qt.loadUiType for the MainWindow like in the
>>> designerExample.py example, but I would like to use uic.loadUi(),
>>> loader.load() for my other Ui files. I'm trying to avoid creating *.py
>>> files using pysideuic.
>>> I'm going to try adding in ParameterTree as a promoted widget and see
>>> what happens.
>>>
>>> ----
>>> Tim Williams
>>>
>>>
>>> On Sun, Jan 31, 2021 at 6:12 AM Patrick <[email protected]> wrote:
>>>
>>>> Hi,
>>>>
>>>> I'm not sure if this will help you, but I've been using PySide2 for one
>>>> of my latest projects and I remember having all sorts of issues getting
>>>> .ui
>>>> to load, as the uic.loadUi() method I used to use for PyQt5 didn't
>>>> directly
>>>> translate. It turns out PySide2 only fairly recently implemented the
>>>> PySide2.QtUiTools.loadUiType() method which was the only way I got it to
>>>> work, but it wasn't (isn't?) documented. I believe it should also work
>>>> using PyQt5.uic.loadUiType(), though haven't tried it. My UI classes look
>>>> something like:
>>>>
>>>> # ...
>>>> from PySide2 import QtCore, QtGui, QtWidgets
>>>> from PySide2.QtUiTools import loadUiType
>>>> # ...
>>>>
>>>> class DataPanel(QtWidgets.QWidget, loadUiType(__file__.split(".py")[0]
>>>> + ".ui")[0]):
>>>>
>>>> def __init__(self, parent=None):
>>>> super().__init__(parent)
>>>> self.setupUi(self)
>>>> # ...
>>>>
>>>> # ...
>>>>
>>>> The .ui file is created as normal (named the same as the python file
>>>> but with .ui extension), with the GraphicsLayoutWidget extended from
>>>> QGraphicsView as described in the pyqtgraph documentation. The relevant
>>>> section in the .ui XML then looks like:
>>>>
>>>> <customwidgets>
>>>> <customwidget>
>>>> <class>GraphicsLayoutWidget</class>
>>>> <extends>QGraphicsView</extends>
>>>> <header>mypackage.pyqtgraph</header>
>>>> </customwidget>
>>>> </customwidgets>
>>>>
>>>> where "mypackage" is my application package name, and I have pyqtgraph
>>>> in a directory under it as a subpackage. If you are using a system
>>>> installation of pyqtgraph, then the header field should just be
>>>> "pyqtgraph".
>>>>
>>>> Hopefully that might give you some ideas anyway.
>>>>
>>>> Patrick
>>>>
>>>>
>>>>
>>>> On Saturday, 30 January 2021 at 11:13:33 am UTC+10:30 [email protected]
>>>> wrote:
>>>>
>>>>> As a follow-up, I'm using registerCustomWidget for the promoted
>>>>> widgets:
>>>>>
>>>>> loader = QUiLoader()
>>>>> loader.registerCustomWidget(pg.GraphicsLayoutWidget)
>>>>> loader.registerCustomWidget(pg.widgets.TreeWidget)
>>>>> loader.registerCustomWidget(pg.parametertree.ParameterTree)
>>>>>
>>>>>
>>>>> ----
>>>>> Tim Williams
>>>>>
>>>>>
>>>>> On Fri, Jan 29, 2021 at 7:29 PM [email protected] <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> HI,
>>>>>>
>>>>>> (Sorry about the formatting - not used to google groups posting.)
>>>>>>
>>>>>> I have an application I'm trying to get working with PySide2. I made
>>>>>> changes following the example designerExample.py .
>>>>>> <https://github.com/pyqtgraph/pyqtgraph/blob/master/examples/designerExample.py>
>>>>>> Everything seems to work fine with PyQt5, but when I try to use
>>>>>> PySide everytime I try to do a ParameterTree.setParmeters() I get an
>>>>>> error
>>>>>> like this:
>>>>>>
>>>>>> File
>>>>>> "C:\Users\Tim\pyside2_env\lib\site-packages\pyqtgraph\parametertree\ParameterTree.py",
>>>>>>
>>>>>> line 48, in setParameters
>>>>>> self.clear()
>>>>>> File
>>>>>> "C:\Users\Tim\pyside2_env\lib\site-packages\pyqtgraph\parametertree\ParameterTree.py",
>>>>>>
>>>>>> line 85, in clear
>>>>>> self.invisibleRootItem().takeChildren()
>>>>>> File
>>>>>> "C:\Users\Tim\pyside2_env\lib\site-packages\pyqtgraph\widgets\TreeWidget.py",
>>>>>>
>>>>>> line 390, in takeChildren
>>>>>> childs = self._real_item.takeChildren()
>>>>>> RuntimeError: Internal C++ object (PySide2.QtWidgets.QTreeWidgetItem)
>>>>>> already deleted.
>>>>>>
>>>>>> I'm using PySide2.QUiTools.QuiLoader().load to load my UI file for
>>>>>> PySide2, and
>>>>>> uic.loadUI for PyQt5.
>>>>>>
>>>>>> with importlib.resources.path('nvfieldcap.resources.ui',
>>>>>> 'paramtreeDialog.ui') as uifilename:
>>>>>> if 'PySide2' in sys.modules:
>>>>>> self.dialog = loader.load(uifilename.as_posix())
>>>>>> if 'PyQt5' in sys.modules:
>>>>>> self.dialog = QtWidgets.QDialog()
>>>>>> uic.loadUi(uifilename.as_posix(), self.dialog)
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to a topic in
>>>>>> the Google Groups "pyqtgraph" group.
>>>>>> To unsubscribe from this topic, visit
>>>>>> https://groups.google.com/d/topic/pyqtgraph/uv2uyQCu9MM/unsubscribe.
>>>>>> To unsubscribe from this group and all its topics, send an email to
>>>>>> [email protected].
>>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/pyqtgraph/f04abdf3-068a-41c4-a993-6076713ca61an%40googlegroups.com
>>>>>>
>>>>>> <https://groups.google.com/d/msgid/pyqtgraph/f04abdf3-068a-41c4-a993-6076713ca61an%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>> --
>>>> You received this message because you are subscribed to a topic in the
>>>> Google Groups "pyqtgraph" group.
>>>> To unsubscribe from this topic, visit
>>>> https://groups.google.com/d/topic/pyqtgraph/uv2uyQCu9MM/unsubscribe.
>>>> To unsubscribe from this group and all its topics, send an email to
>>>> [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/pyqtgraph/106f2150-1724-4402-8e29-bd3cd30bd0fbn%40googlegroups.com
>>>>
>>>> <https://groups.google.com/d/msgid/pyqtgraph/106f2150-1724-4402-8e29-bd3cd30bd0fbn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>
--
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/65b54436-689f-4120-b49a-7cea7f87a98fn%40googlegroups.com.