pyqt5 創建一個組件,self參數什麼時候用

學過python的同學,肯定都知道,python裏頭的類的方法,第一個參數都是self表示當前類的某個實例,然後pyqt5在創建一個組件的時候,似乎所有的構造器都會有一個parent的參數。

所以這個時候問題就來了:parent到底要不要給他賦值,賦值什麼呢

答案是:

當創建的這個組件是屬於這個self的直接子組件,就要給他賦值,賦值內容就是self。否則就不賦值放空。

下面舉個例子:

目標:實現將兩個按鈕放在窗口中間

parent賦值self場景

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()

    def initUI(self):
        ok=QPushButton('ok')
        cancle = QPushButton('cancel')

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(ok)
        vbox.addWidget(cancle)
        vbox.addStretch(1)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addLayout(vbox)
        hbox.addStretch(1)

        self.setGeometry(600, 300, 300,300)
        self.setLayout(hbox)
        self.setWindowTitle('box')
        self.show()

if __name__=='__main__':
    app = QApplication(sys.argv)

    example = Example()
    example.initUI()

    sys.exit(app.exec())

上述案例裏頭,按鈕和佈局的構造器都沒有給parent參數賦值。這個時候得到的結果如下:

parent賦值self場景

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()

    def initUI(self):
        ok=QPushButton('ok',self)
        cancle = QPushButton('cancel',self)

        vbox = QVBoxLayout(self)
        vbox.addStretch(1)
        vbox.addWidget(ok)
        vbox.addWidget(cancle)
        vbox.addStretch(1)

        hbox = QHBoxLayout(self)
        hbox.addStretch(1)
        hbox.addLayout(vbox)
        hbox.addStretch(1)

        self.setGeometry(600, 300, 300,300)
        self.setLayout(hbox)
        self.setWindowTitle('box')
        self.show()

if __name__=='__main__':
    app = QApplication(sys.argv)

    example = Example()
    example.initUI()

    sys.exit(app.exec())

上面這個案例呢,是給parent賦值,得到的結果如下:

看到這邊大家應該就明白了。

爲了實現將兩個按鈕放在窗口中間,就應該要使用案例1的方式。其實很好理解,案例1表示按鈕是佈局的一個直接子組件。而案例2表示按鈕和佈局都是窗口的一個子組件。顯然,不能實現我們的預期效果。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章