python - 需要帮助理解 PyQt5 中的继承
问题描述
我正在尝试将我的代码组织成类。在下面的示例中,B
需要C
继承按钮的名称,A
以便按钮在按下时回显语句。为了让我让它正常工作,我必须创建Dummy
和继承B
,C
然后在Dummy
. 这似乎不是我应该这样做的方式。在 PyQt5 中使用多个类是否有“更好”或“更被接受”的方式?
继承.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'inheritance.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(452, 246)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.b_pushButton = QtWidgets.QPushButton(self.centralwidget)
self.b_pushButton.setGeometry(QtCore.QRect(40, 50, 151, 81))
self.b_pushButton.setObjectName("b_pushButton")
self.c_pushButton = QtWidgets.QPushButton(self.centralwidget)
self.c_pushButton.setGeometry(QtCore.QRect(230, 50, 151, 81))
self.c_pushButton.setObjectName("c_pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 452, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.b_pushButton.setText(_translate("MainWindow", "B"))
self.c_pushButton.setText(_translate("MainWindow", "C"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
主脚本:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from inheritance import Ui_MainWindow
class A(QMainWindow):
def __init__(self):
super(A, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
class B(A):
def __init__(self):
super(B, self).__init__()
self.ui.b_pushButton.clicked.connect(self.pushB)
def pushB(self):
print('You pushed the "B" button')
print()
class C(A):
def __init__(self):
super(C, self).__init__()
self.ui.c_pushButton.clicked.connect(self.pushC)
def pushC(self):
print('You pushed the "C" button')
print()
class Dummy(B, C):
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
main = Dummy()
main.show()
sys.exit(app.exec_())
解决方案
我最终做了 eyllanesc 建议的事情。我最初试图将与 B 和 C 相关的所有内容都保留在他们自己的类中,因为我的实际代码很长,但这样做可以。
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from inheritance import Ui_MainWindow
class A(QMainWindow):
def __init__(self):
super(A, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.B = B()
self.C = C()
self.ui.b_pushButton.clicked.connect(self.B.pushB)
self.ui.c_pushButton.clicked.connect(self.C.pushC)
class B:
def pushB(self):
print('You pushed the "B" button')
print()
class C:
def pushC(self):
print('You pushed the "C" button')
print()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = A()
main.show()
sys.exit(app.exec_())
推荐阅读
- python - 带有滑块和固定几何图形的交互式 matplotlib
- html - 介绍 HTML 和 CSS 无法在 div 内正确居中画廊标题
- javascript - 我想将所有出现的“单词”替换为单词
- c++ - 通过搜索硬盘找到文件目录
- swift4 - 如何在没有 alamofire 且不将图像转换为字符串(base 64)的情况下在 api 中发送纯图像?
- amazon-web-services - 如何使用 Xshell 6 连接 aws ec2
- response - 在 Dialogflow Assistant 中自定义帐户链接消息
- angular - 无法构建离子项目
- oracle-data-integrator - oracle ODI删除IKM sql增量更新中的所有选项有事务吗?
- yugabyte-db - 如何在 yugabyte-db 中设置 Universe 名称和命名空间?