[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: [PyQt] PyQt5.uic.loadUiType() ignores <customwidgets> for main widget class
From: Kyle Altendorf <sda () fstab ! net>
Date: 2019-08-04 16:38:28
Message-ID: eb22c4d23715e8aeba85fb61892b8836 () fstab ! net
[Download RAW message or body]
It looks like presently PyQt5.uic.loadUiType() assumes that the .ui
file's base widget's class is going to be in PyQt5.QtWidgets. This is
not the case for mine which often use a custom type specified in the
<customwidgets> section.
Rather than:
return (ui_globals[winfo["uiclass"]], getattr(QtWidgets,
winfo["baseclass"]))
This seems to work:
ui_base = ui_globals.get(winfo["baseclass"])
if ui_base is None:
ui_base = getattr(QtWidgets, winfo["baseclass"])
return (ui_globals[winfo["uiclass"]], ui_base)
Example code and output are available at:
https://gist.github.com/altendky/325d0737a923e6f678617364e0f68f83
Output:
sys.version: 3.7.4 (default, Aug 2 2019, 12:58:45)
[GCC 6.3.0 20170516]
sys.platform: linux
QT_VERSION_STR: 5.13.0
PYQT_VERSION_STR: 5.13.0
SIP_VERSION_STR: 4.19.18
Traceback (most recent call last):
File "bad3.py", line 50, in <module>
main()
File "bad3.py", line 46, in main
Ui, UiBase = PyQt5.uic.loadUiType(io.StringIO(ui_text))
File
"/home/altendky/st.src/venv/lib/python3.7/site-packages/PyQt5/uic/__init__.py",
line 204, in loadUiType
return (ui_globals[winfo["uiclass"]], getattr(QtWidgets,
winfo["baseclass"]))
AttributeError: module 'PyQt5.QtWidgets' has no attribute 'MyWidget'
I'll attach my files again here but last time they didn't seem to be
liked. If anyone has suggestions on what I should do differently when
attaching I'm happy to hear them. I'm using RoundCube webmail.
Cheers,
-kyle
["bad3.py" (text/x-python)]
import io
import sys
import PyQt5.QtCore
import PyQt5.QtWidgets
import PyQt5.uic
import sip
system_info = f'''\
sys.version: {sys.version}
sys.platform: {sys.platform}
QT_VERSION_STR: {PyQt5.QtCore.QT_VERSION_STR}
PYQT_VERSION_STR: {PyQt5.QtCore.PYQT_VERSION_STR}
SIP_VERSION_STR: {sip.SIP_VERSION_STR}'''
ui_text = '''\
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="MyWidget" name="Form">
<layout class="QVBoxLayout" name="layout">
</layout>
</widget>
<customwidgets>
<customwidget>
<class>MyWidget</class>
<extends>QWidget</extends>
<header>bad3</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
'''
class MyWidget(PyQt5.QtWidgets.QWidget):
pass
def main():
print(system_info)
app = PyQt5.QtWidgets.QApplication([])
Ui, UiBase = PyQt5.uic.loadUiType(io.StringIO(ui_text))
if __name__ == '__main__':
main()
#exec(code_string.getvalue(), ui_globals)
#ui_base = ui_globals.get(winfo["baseclass"])
#if ui_base is None:
#ui_base = getattr(QtWidgets, winfo["baseclass"])
#return (ui_globals[winfo["uiclass"]], ui_base)
["out" (text/x-c)]
~/st.src boots ● venv/bin/python bad3.py
sys.version: 3.7.4 (default, Aug 2 2019, 12:58:45)
[GCC 6.3.0 20170516]
sys.platform: linux
QT_VERSION_STR: 5.13.0
PYQT_VERSION_STR: 5.13.0
SIP_VERSION_STR: 4.19.18
Traceback (most recent call last):
File "bad3.py", line 50, in <module>
main()
File "bad3.py", line 46, in main
Ui, UiBase = PyQt5.uic.loadUiType(io.StringIO(ui_text))
File "/home/altendky/st.src/venv/lib/python3.7/site-packages/PyQt5/uic/__init__.py", \
line 204, in loadUiType return (ui_globals[winfo["uiclass"]], getattr(QtWidgets, \
winfo["baseclass"]))
AttributeError: module 'PyQt5.QtWidgets' has no attribute 'MyWidget'
[Attachment #5 (text/plain)]
_______________________________________________
PyQt mailing list PyQt@riverbankcomputing.com
https://www.riverbankcomputing.com/mailman/listinfo/pyqt
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic