pyqt5,qt 5.9.6。
发生以下问题我想基于另一个类(UserForm
(生成模态对话框(Dialog
(。但是,如果UserForm
已经从QWidget
继承,那么我的脚本会提出异常
'对话框'对象没有属性'exec _'
或只是默默崩溃,或者在控制台中使用消息崩溃:
qdialog :: exec:检测到递归呼叫
mro是否从qwidget继承了UserForm
是否完全相同:
(<class '__main__.Dialog'>, <class '__main__.UserForm'>, <class
'PyQt5.QtWidgets.QDialog'>, <class 'PyQt5.QtWidgets.QWidget'>, <class
'PyQt5.QtCore.QObject'>, <class 'sip.wrapper'>, <class
'PyQt5.QtGui.QPaintDevice'>, <class 'sip.simplewrapper'>, <class 'object'>)
示例:
from PyQt5 import QtWidgets
app = QtWidgets.QApplication([])
class UserForm(QtWidgets.QWidget):
pass
# class Dialog(UserForm, QtWidgets.QDialog):
# pass
Dialog = type("Dialog", (UserForm, QtWidgets.QDialog), {})
print(Dialog.__mro__)
Dialog().exec_()
我还尝试使用Pyside2,QT 5.12运行此代码,并且它没有问题。这是否意味着PYQT中有一些错误?
相反,它是pyside2的错误,因为它与文档相矛盾:
多重继承需要首先
如果您正在使用多继承,MOC假定第一个继承类是一个Qobject的子类。另外,请确保只有第一个继承的类是一个qobject。
如果考虑了上一部分中描述的行为,则对话框类应仅考虑用户形式而不是qdialog,因此对话框不应具有exec_((方法,因为只有从qdialog继承的类才能拥有。P>
-
在qt中,您不应从2个qobject继承,只支持mixins(qobject qobject((1((2(。
。 -
如果是混合蛋白,则第一个必须是qobject。
这就是Pyuic继承的模式:
from PyQt5 import QtCore, QtGui, QtWidgets
# or
# from PySide2 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok
)
self.buttonBox.setObjectName("buttonBox")
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept)
self.buttonBox.rejected.connect(Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
def init(self, parent=None):
super(self.__class__, self).__init__(parent)
self.setupUi(self)
# or
# class Dialog(QtWidgets.QDialog, Ui_Dialog):
# def __init__(self, parent=None):
# super(Dialog, self).__init__(parent)
# self.setupUi(self)
Dialog = type("Dialog", (QtWidgets.QDialog, Ui_Dialog), {"__init__": init})
if __name__ == "__main__":
app = QtWidgets.QApplication([])
Dialog().exec_()
(1(多个继承
(2(合作多胸