首页 > 解决方案 > PyQt5 中的 OOP 概念使用 Qt Designer

问题描述

我正在尝试使用带有 Qt Designer 的 PyQt5 制作一个应用程序,并阅读了 BMHarwani 的一本书“Qt5 Python GUI Programming cookbook”。在阅读第 4 章作者的示例时,我对 OOP 概念有一些疑问。

假设我们有以下 GUI,并将 demoSimpleInheritance.ui 文件转换为 Python 文件,名为 demoSimpleInheritance.py

在此处输入图像描述

文件:demoSimpleInheritance.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog): 
        Dialog.setObjectName("Dialog")
        Dialog.resize(487, 368)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(60, 30, 101, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(60, 80, 91, 16))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(Dialog)
        self.label_3.setGeometry(QtCore.QRect(60, 130, 91, 16))
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(Dialog)
        self.label_4.setGeometry(QtCore.QRect(60, 180, 111, 16))
        self.label_4.setObjectName("label_4")
        self.labelResponse = QtWidgets.QLabel(Dialog)
        self.labelResponse.setGeometry(QtCore.QRect(100, 230, 291, 61))
        self.labelResponse.setText("")
        self.labelResponse.setObjectName("labelResponse")
        self.ButtonClickMe = QtWidgets.QPushButton(Dialog)
        self.ButtonClickMe.setGeometry(QtCore.QRect(190, 320, 113, 32))
        self.ButtonClickMe.setObjectName("ButtonClickMe")
        self.lineEditCode = QtWidgets.QLineEdit(Dialog)
        self.lineEditCode.setGeometry(QtCore.QRect(200, 30, 171, 21))
        self.lineEditCode.setObjectName("lineEditCode")
        self.lineEditName = QtWidgets.QLineEdit(Dialog)
        self.lineEditName.setGeometry(QtCore.QRect(200, 80, 171, 21))
        self.lineEditName.setObjectName("lineEditName")
        self.lineEditHistoryMarks = QtWidgets.QLineEdit(Dialog)
        self.lineEditHistoryMarks.setGeometry(QtCore.QRect(200, 130, 171, 21))
        self.lineEditHistoryMarks.setObjectName("lineEditHistoryMarks")
        self.lineEditGeographyMarks = QtWidgets.QLineEdit(Dialog)
        self.lineEditGeographyMarks.setGeometry(QtCore.QRect(200, 180, 171, 21))
        self.lineEditGeographyMarks.setObjectName("lineEditGeographyMarks")

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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "Student Code"))
        self.label_2.setText(_translate("Dialog", "Student Name"))
        self.label_3.setText(_translate("Dialog", "History Marks"))
        self.label_4.setText(_translate("Dialog", "Geography Marks"))
        self.ButtonClickMe.setText(_translate("Dialog", "Click"))

在此之后,我们为真正的实现创建另一个名为 callSimpleInheritances.py 的 Python 文件,例如使按钮响应

文件:callSimpleInheritances.py

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from demoSimpleInheritance import *

class Student:
    name = ''
    code = ''
    def __init__(self, code, name):
        self.code = code
        self.name = name
    def getCode(self):
        return self.code
    def getName(self):
        return self.name

class Marks(Student):
    historyMarks = 0
    geographyMarks = 0
    def __init__(self, code, name, historyMarks, geographyMarks):
        Student.__init__(self, code, name) 
        self.historyMarks = historyMarks
        self.geographyMarks = geographyMarks
    def getHistoryMarks(self):
        return self.historyMarks
    def getGeographyMarks(self):
        return self.geographyMarks

class MyForm(QDialog):
    def __init__(self):  
        super().__init__()  
        self.ui = Ui_Dialog() 
        self.ui.setupUi(self)  
        self.ui.ButtonClickMe.clicked.connect(self.dispmessage)
        self.show()

    def dispmessage(self):
        marksObj = Marks(self.ui.lineEditCode.text(), self.ui.lineEditName.text(),
                         self.ui.lineEditHistoryMarks.text(), self.ui.lineEditGeographyMarks.text())
        self.ui.labelResponse.setText("Code: " + marksObj.getCode() + ", Name: " + marksObj.getName()
                                      + ", History Marks: " + marksObj.getHistoryMarks() + ", Geography Marks: "
                                      + marksObj.getGeographyMarks())


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

我有以下问题:

在 demoSimpleInheritance.py 中:

(1)为什么__init__Ui_Dialog类中缺少方法?

在 callSimpleInheritance.py 中:

(2) Marks继承自Student,MyForm继承自QDialog,但它们的__init__方法不同:

Marks 类用Student.__init__(self, code, name),MyForm 类用super().__init__(),请问什么时候用哪个?

另外,我尝试super().__init__(self, code, name)在 Marks 类中使用,但没有成功。

(3) 我在一些例子中看到,作者把论据放在了super().__init__(),例如super(*args).__init__(*args),请问这是什么时候?

(4) MyForm 类有一个名为 ui 的属性,例如self.ui = Ui_Dialog(),但 MyForm 在 中没有其他参数__init__(self),例如为什么我们不使用__init__(self, ui)

(5) setupUi(self, Dialog)demoSimpleInheritance.py中有参数Dialog,但在callSimpleInheritance.py中没有看到这个参数,例如self.ui.setupUi(self)。我可以问为什么吗?

如果有的话,还请给我一些参考,谢谢。

标签: pythonclassooppyqt5qt-designer

解决方案


推荐阅读