前面学习了,面对对象编程,继承,有了一些理解。继续学习pyqt5
看到下面有了一些疑问。
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIconclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 300, 220)self.setWindowTitle('Icon')self.setWindowIcon(QIcon('web.png')) self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())
class Example(QWidget)
Example继承了QWidget的所有遗产
__init__()初始化了父类的__init__(),下面一句self.initUI(),初始化本身的方法 initUI()
在initUI()方法中,self指的到底是谁????这是我的疑问。
self指的是class Example实例化的对象,在这里就是对象ex。
因为Example继承了QWidget的所有遗产,也就是ex也继承了QWidget的所有遗产
self.setGeometry(300, 300, 300, 220)self.setWindowTitle('Icon')self.setWindowIcon(QIcon('web.png'))
这三个方法原本属于,QWidget,现在Example,也可以拥有,切可以增加其它的方法,比如 initUI()
重要的是,self指的是实例化后的对象本身。
自己又写了一个例子,帮自己理解一下
class A:def __init__(self):print("A")def f(self):print("f")class B(A):def __init__(self):print("B")super().__init__()self.a()self.f()def a(self):self.f()if __name__ == '__main__':a=B()
对clas B实例化 a=B(),初始化。
问题:
这是QT designer产生ui文件转换过来的文件
from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(516, 396)self.layoutWidget = QtWidgets.QWidget(Form)self.layoutWidget.setGeometry(QtCore.QRect(10, 40, 320, 223))self.layoutWidget.setObjectName("layoutWidget")self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)self.gridLayout.setContentsMargins(0, 0, 0, 0)self.gridLayout.setObjectName("gridLayout")self.textEdit = QtWidgets.QTextEdit(self.layoutWidget)self.textEdit.setObjectName("textEdit")self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 4)self.num_1 = QtWidgets.QPushButton(self.layoutWidget)self.num_1.setObjectName("num_1")self.gridLayout.addWidget(self.num_1, 1, 0, 1, 1)self.num_2 = QtWidgets.QPushButton(self.layoutWidget)self.num_2.setObjectName("num_2")self.gridLayout.addWidget(self.num_2, 1, 1, 1, 1)self.num_3 = QtWidgets.QPushButton(self.layoutWidget)self.num_3.setObjectName("num_3")self.gridLayout.addWidget(self.num_3, 1, 2, 1, 1)self.num_4 = QtWidgets.QPushButton(self.layoutWidget)self.num_4.setObjectName("num_4")self.gridLayout.addWidget(self.num_4, 1, 3, 1, 1)self.retranslateUi(Form)self.num_2.clicked.connect(Form.n_2)self.num_1.clicked.connect(Form.n_1)self.num_3.clicked.connect(Form.n_3)self.num_4.clicked.connect(Form.n_4)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.textEdit.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>"))self.num_1.setText(_translate("Form", "1"))self.num_2.setText(_translate("Form", "2"))self.num_3.setText(_translate("Form", "3"))self.num_4.setText(_translate("Form", "4"))
现在要来编写对应的槽函数,即
self.num_2.clicked.connect(Form.n_2)self.num_1.clicked.connect(Form.n_1)self.num_3.clicked.connect(Form.n_3)self.num_4.clicked.connect(Form.n_4)
首先根据designer,Form,是一个QWidget类,在调用setupUi(self, Form)方法时,需要传入一个对象,属于QWidget类。
但这个类里面还得包括,自定义的四个方法,n_1,n_2,n_3,n_4。
这里可以使用继承,新建一个类aa,继承了两个类,QWidget,Ui_Form
class aa(QtWidgets.QWidget,Ui_Form):def n_1(self):self.textEdit.setText("1")def n_2(self):self.textEdit.setText("2")def n_3(self):self.textEdit.setText("3")def n_4(self):self.textEdit.setText("4")
现在,aa,相当强大不但拥有,QWidget和Ui_Form家族的所有财产,还有自己家的n_1,n_2,n_3,n_4
加入下面的代码,就能运行了。这是我误打误撞写的,虽然是对的,但还有疑问???????????
if __name__=="__main__":import sysapp=QtWidgets.QApplication(sys.argv)b=aa()b.setupUi(b)b.show()sys.exit(app.exec_())
这句 b.setupUi(b) 传入的是它本身。让我有点意外,但想想也对,b是aa的实例化,也属于QWidget类。
希望有缘人给予解答,这样写,怎么就对了。