学习pyqt 继承中self的疑问

前面学习了,面对对象编程,继承,有了一些理解。继续学习pyqt5

看到下面有了一些疑问。 

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class 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, QtWidgets


class 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.translate
        Form.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 sys
    app=QtWidgets.QApplication(sys.argv)
    b=aa()
    b.setupUi(b)
    b.show()
    sys.exit(app.exec_())
 

这句       b.setupUi(b)          传入的是它本身。让我有点意外,但想想也对,b是aa的实例化,也属于QWidget类。

希望有缘人给予解答,这样写,怎么就对了。

发布了82 篇原创文章 · 获赞 72 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/fzf1996/article/details/96455799
今日推荐