Thanks. Working on that now. The latest version for PySide2 on conda is at 
5.13.2 (at least that's what I'm finding - need to check my  channel order)
My python version is at 3.7.8 for other reasons. I'm current trying out a 
venv and have pip installed PySide2 v5.15.2. 

Still in debugger, but...

from PySide2.QtUiTools import loadUiType as ps2_loadUiType

(PySide2)
ps2_loadUiType(uifilename.as_posix())
(<class '__main__.Ui_Filename_Folder_Widget'>, <class 
'PySide2.QtWidgets.QTabWidget'>)

pyqtgraph
pg.Qt.loadUiType(uifilename.as_posix())
(<class 'Ui_Filename_Folder_Widget'>, <class 
'PySide2.QtWidgets.QTabWidget'>)

I haven't finished stepping through the debugger, but I'm hopeful.

On Monday, February 1, 2021 at 11:35:41 AM UTC-5 [email protected] wrote:

> On pyside2 5.14.0-5.14.2.1 there were pyuic issues, would recommend going 
> to 5.15.0+ or 5.14.2.2.
>
> On Mon, Feb 1, 2021 at 08:32 [email protected] <[email protected]> wrote:
>
>> 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
>>  
>> <https://groups.google.com/d/msgid/pyqtgraph/2db65699-7066-4807-985e-d1bdec077998n%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/d5a1d385-8e1a-471a-88d6-ba77d8f0537en%40googlegroups.com.

Reply via email to