python - PyQt5 - 无法解析对话框的插槽

标签 python qt pyqt

我正在尝试使用 PyQt5 将一个小型 Qt C++ 应用程序移植到 Python,但我现在在最基本的东西上遇到了麻烦。
我使用 pyuic 实用程序将 .ui 文件转换为其相应的 .py 文件,表示对话框的静态定义的 UI 和两个信号/槽对(两个按钮)。确切的错误是“'QDialog'对象没有属性'pushButtonStartClick'”,虽然我理解它所描述的内容,但我不知道如何准确修复它。我什至不确定是否可以在 Ui 类中定义自定义插槽。如果这是真的,那就代表了一个相当大的限制。我在 Windows 计算机上使用 PyQt 5.4 和 Python 2.7。

附加信息 - 简单 tutorial我一直在阅读并尝试模仿。

提前谢谢您。

生成的包含 UI 类的 .py 文件(其中一部分,源 .ui 文件为 here ):

class Ui_NewGameDialog(object):
    def setupUi(self, NewGameDialog):
        NewGameDialog.setObjectName("NewGameDialog")
        NewGameDialog.setWindowModality(QtCore.Qt.ApplicationModal)
        NewGameDialog.resize(265, 200)
        #
        # ...
        #
        self.retranslateUi(NewGameDialog)
        # part where it breaks apart
        self.pushButtonStart.clicked.connect(NewGameDialog.pushButtonStartClick)
        self.pushButtonCancel.clicked.connect(NewGameDialog.pushButtonCancelClick)
        QtCore.QMetaObject.connectSlotsByName(NewGameDialog)

继承它的类:

class NewGameDialog(Ui_NewGameDialog):
    def __init__(self, dialog):
        Ui_NewGameDialog.__init__(self)
        self.setupUi(dialog)
        dialog.setFixedSize(dialog.size())
        dialog.setWindowFlags(
                dialog.windowFlags() ^ QtCore.Qt.WindowContextHelpButtonHint
        )

    @pyqtSlot(name="pushButtonStartClick")
    def pushButtonStartClick(self):
        pass

    @pyqtSlot(name="pushButtonCancelClick")
    def pushButtonCancelClick(self):
        pass

初始化:

if __name__ == "__main__":
    app = QApplication(sys.argv)

    dialog = QtWidgets.QDialog()
    ui = NewGameDialog(dialog)
    dialog.show()

    sys.exit(app.exec_())

最佳答案

我认为 setupUi 方法获取了错误类型的对象,因为 QDialog 没有这些 pushButtonStartClickpushButtonCancelClick

class NewGameDialog(QtGui.QDialog, Ui_NewGameDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        Ui_NewGameDialog.__init__(self)
        self.setupUi(self)
        self.setFixedSize(self.size())
        self.setWindowFlags(
            self.windowFlags() ^ QtCore.Qt.WindowContextHelpButtonHint
        )

    @pyqtSlot(name="pushButtonStartClick")
    def pushButtonStartClick(self):
        pass

    @pyqtSlot(name="pushButtonCancelClick")
    def pushButtonCancelClick(self):
        pass

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    dialog = NewGameDialog()
    dialog.show()

    sys.exit(app.exec_())

没有多重继承:

class NewGameDialog(QtGui.QDialog):
    def __init__(self):
        super(NewGameDialog, self).__init__()
        self.ui = Ui_NewGameDialog()
        self.ui.setupUi(self)
...

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    dialog = NewGameDialog()

关于python - PyQt5 - 无法解析对话框的插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34845041/

相关文章:

python - pyqt4:如何查看QWebPage?

python - 应该避免通配符导入吗?

python - 将参数传递给 PyQt SIGNAL 连接

python - 如何使用 PyQt Signal Slot 连接两个类?

linux - QTableWidget 在删除多行时崩溃

python - 用回归填充 NaN 值

python - 列表与列表的列表的乘法

python - 尝试使用 Python 解析 xml 文件并将文本数据放入字典中。 key 错误 : 0

c++ - 如何同时使用 Qt 和 SDL?

python - 如何从Python代码设置内部vim变量