布局分類
絕對定位:使用move方法將空間直接定死在某個坐標,不會隨着窗口大小的改變而改變
可變布局:使用各種布局管理器,實現組件的位置和大小隨着窗口的變化而變化
布局管理器
-
QHBoxLayout:水平布局管理器,水平大小自動變化,垂直大小不變
-
QVBoxLayout:垂直布局管理器,水平大小不變,垂直大小自動變化
-
QGridLayout:網格布局管理器,水平和垂直兩個方向自動變化
-
QFormLayout:表單布局管理器,一行由兩列組成,分別是顯示和輸入,水平大小自動變化,垂直大小不變
-
QSplitter:特殊的管理器,實際上是個控件,可以實現里面的子組件邊界拖動功能
接口
方法 | 描述 |
addLayout(layout, stretch) | 設置窗口的布局管理器,stretch表示伸縮量(默認值0) |
addWidget(widget, stretch, aligment) | 添加控件到布局管理器中 |
addSpacing(int) | 在控件之間添加間距,間距大小固定,單位是像素 |
addStretch(stretch) | 在布局管理器中添加一個可伸縮的布局管理器 |
addWidget(widget, x, y) | 網管布局管理器方法,在(x,y)處添加控件 |
addWidget(widget, x, y, row,column, aligment) | 網管布局管理器方法,從(x,y)開始row行column列出添加控件(跨格) |
addRow(label,edit) | 表單布局管理器方法,添加一行 |
例子
import random import string import sys from PyQt5.QtCore import Qt, QRect from PyQt5.QtGui import QPainter, QFont, QColor, QPen, QBrush from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayout, \ QFormLayout, QLineEdit, QSplitter class MyWidget(QWidget): def __init__(self): super(MyWidget, self).__init__() # 水平布局管理 # hboxlayout = QHBoxLayout() # # 設置所有組件間距,單位是像素 # # hboxlayout.setSpacing(50) # hboxlayout.addWidget(QPushButton('1'), 1) # # 添加空隙,單位是像素 # # hboxlayout.addSpacing(50) # hboxlayout.addWidget(QPushButton('2'), 1) # hboxlayout.addWidget(QPushButton('3'), 1) # hboxlayout.addWidget(QPushButton('4'), 2) # self.setLayout(hboxlayout) # 垂直布局管理 # vboxlayout = QVBoxLayout() # vboxlayout.addWidget(QLabel('1'), 1) # # 添加可伸縮的空隙 # # vboxlayout.addStretch(1) # vboxlayout.addWidget(QLabel('2'), 1) # vboxlayout.addWidget(QLabel('3'), 1) # vboxlayout.addWidget(QLabel('4'), 2) # self.setLayout(vboxlayout) # 網格布局管理 # gridLayout = QGridLayout() # self.setLayout(gridLayout) # # gridLayout.addWidget(QPushButton('1'), 0, 0) # gridLayout.addWidget(QPushButton('2'), 0, 1) # gridLayout.addWidget(QPushButton('3'), 0, 2) # gridLayout.addWidget(QPushButton('4'), 1, 0) # # gridLayout.addWidget(QPushButton('5'), 1, 1) # # gridLayout.addWidget(QPushButton('6'), 1, 2) # gridLayout.addWidget(QPushButton('7'), 2, 0) # # gridLayout.addWidget(QPushButton('8'), 2, 1) # # gridLayout.addWidget(QPushButton('9'), 2, 2) # # # 一個組件占用多個格子 # gridLayout.addWidget(QPushButton('A'), 1, 1, 2, 2) # 表單布局管理 # formLayout = QFormLayout() # self.setLayout(formLayout) # # formLayout.addRow(QLabel('用戶名'), QLineEdit()) # formLayout.addRow(QLabel('密 碼'), QLineEdit()) # 可拖動布局管理 hboxlayout = QHBoxLayout() self.setLayout(hboxlayout) splitter = QSplitter() hboxlayout.addWidget(splitter) splitter.addWidget(QPushButton('1')) splitter.addWidget(QPushButton('2')) if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.resize(500, 300) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())