【问题标题】:PyQt connecting signal between sub class and parent class [duplicate]子类和父类之间的PyQt连接信号[重复]
【发布时间】:2021-03-05 19:08:01
【问题描述】:

我想创建一个简单的按钮来触发一些任务。我正在使用 PyQt 设计器构建 GUI,并尝试遵循不直接编辑 UI 模块而是将我的自定义代码放在单独的模块中然后继承所有 GUI 方面的建议。

这是我的 GUI 类:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(507, 424)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(220, 350, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))

这是我的自定义模块:

from PyQt5 import QtCore,QtGui,QtWidgets

# main.py is the GUI module
import main 


class mainWindow(mainTest.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # I want click this button and print something
        self.pushButton.clicked.connect(self.connectionTest)


    def connectionTest(self):
        print('connected')

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = mainTest.Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

现在我的问题是当我运行模块并单击按钮时,它不会触发打印方法。但是,如果我直接在 GUI 模块中添加我的自定义代码,它将起作用。我认为继承有问题,我对此感到有些困惑。那么这里有什么问题?

【问题讨论】:

  • MainWindow = QtWidgets.QMainWindow()ui = mainTest.Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()更改为w = mainWindow()w.show()
  • 您已经创建了 mainWindow 类,但从未使用它。
  • 也改成class mainWindow(QtWidgets.QMainWindow, mainTest.Ui_MainWindow):

标签: python inheritance pyqt5 qtgui qt-signals


【解决方案1】:

您根本没有使用您的 mainWindow 子类,即使您使用了,它也应该从 QMainWindow 继承。

class MainWindow(QtWidgets.QMainWindow, mainTest.Ui_MainWindow):
    def __init__(self):
        # ...

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

请注意我为MainWindow 类更改的大小写:标准约定是用大写名称命名所有类,因为只有变量和函数应该有小写名称(阅读更多关于官方Style Guide for Python Code)。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2020-03-23
    • 2013-07-14
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多