python - 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)
。我可以问为什么吗?
如果有的话,还请给我一些参考,谢谢。
解决方案
推荐阅读
- python - 从其他python程序在后台运行python并继续
- python - Tkinter pyimage 不存在错误。如果我单独调用该函数一切正常
- java - 从xml转换后,如何使用java将方括号添加到json
- java - 通过字段“userDetailsService”表示的不满足的依赖关系;NoSuchBeanDefinitionException:'org.springframework.securityUserDetailsService'
- python - 如何获取innerHTML元素的文本?
- swift - 如何在 iOS 13 中获取滚动视图的完整快照?
- sed - 如何使用 sed 仅查找文件的第一行和最后一行
- powershell - GetEventLog - 如何在一行中扩展“消息”属性
- azure-active-directory - 如何在非交互式工作流中通过浏览器对 Azure AD 进行身份验证?
- angular - ReferenceError:调用以太坊合约方法时“未定义originalStackTrace”