學過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表示按鈕和佈局都是窗口的一個子組件。顯然,不能實現我們的預期效果。