PYQT:从Qwidget上崩溃



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(合作多胸

相关内容

  • 没有找到相关文章

最新更新