如前一篇筆記,我們還是只討論兩層嵌套布局的情況。
前面的布局有一個缺點:有三個內層布局,則需要三個空部件。那若有十個內層布局呢?顯然會讓人不舒服。
剛才在玩 Qt Designer 時,發現了一個更好的辦法,不管有多少個內層布局,只需要一個空部件。
一、過程分析:
1. 先准備一個全局部件,用於"承載"全局布局
# 全局部件(注意參數 self),用於"承載"全局布局 wwg = QWidget(self)
2. 再定義全局布局
wl = QVBoxLayout(wwg) # 全局布局(注意參數 wwg)
3. 定義三個局部布局
vl = QVBoxLayout() # 三個局部布局 hl = QHBoxLayout() gl = QGridLayout()
4. 當然,局部布局內肯定打算放置一些部件
pass # 這里向局部布局內添加部件
5. 把三個局部布局加到全局布局
wl.addLayout(vl) # 加到全局布局 wl.addLayout(gl) wl.addLayout(hl)
二、全部代碼
from PyQt5.QtWidgets import * class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle('PyQt5布局示例') self.resize(400, 300) # 全局部件(注意參數 self),用於"承載"全局布局 wwg = QWidget(self) wl = QVBoxLayout(wwg) # 全局布局(注意參數 wwg) vl = QVBoxLayout() # 三個局部布局 hl = QHBoxLayout() gl = QGridLayout() pass # 這里向局部布局內添加部件 wl.addLayout(vl) # 加到全局布局 wl.addLayout(gl) wl.addLayout(hl) if __name__=="__main__": import sys app = QApplication(sys.argv) win = MyWindow() win.show() sys.exit(app.exec_())
補充:
照上面的思路,更進一步,可以不要多余的空部件:
from PyQt5.QtWidgets import * class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle('PyQt5布局示例') self.resize(400, 300) # 全局布局(注意參數 self) wl = QVBoxLayout(self) # 局部布局 vl = QVBoxLayout() hl = QHBoxLayout() gl = QGridLayout() # 這里向局部布局內添加部件 hl.addWidget(QPushButton('1')) hl.addWidget(QPushButton('2')) vl.addWidget(QPushButton('3')) vl.addWidget(QPushButton('4')) vl.addWidget(QPushButton('5')) gl.addWidget(QPushButton('6'),0,0) gl.addWidget(QPushButton('7'),0,1) gl.addWidget(QPushButton('8'),1,0) gl.addWidget(QPushButton('9'),1,1) # 加到全局布局 wl.addLayout(hl) wl.addLayout(vl) wl.addLayout(gl) if __name__=="__main__": import sys app = QApplication(sys.argv) win = MyWindow() win.show() sys.exit(app.exec_())
再補充:
addLayout()方法原型:
addLayout(QLayout, row, col, row_cross, col_cross, Qt.Alignment)
addWidget()方法原型:
addWidget(QWidget, row, col, row_cross, col_cross, Qt.Alignment)