介绍
QGridLayout 是 PySide2 中非常实用的网格布局管理器,它能让你像在表格中一样精确地排列界面元素。
作用
QGridLayout 通过行号和列号(均从 0 开始)来定位控件,支持控件跨多行多列,还能设置行列的拉伸策略,适应窗口大小变化。
例子
import sys
from PySide2.QtWidgets import (QApplication, QWidget, QGridLayout,
QPushButton, QLabel, QLineEdit, QTextEdit)
class AdvancedGridLayout(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建网格布局
grid = QGridLayout()
# 设置控件之间的间距(水平和垂直)
grid.setSpacing(10)
# 添加标题(跨4列)
title = QLabel("用户信息表单")
title.setStyleSheet("font-size: 16px; font-weight: bold;")
grid.addWidget(title, 0, 0, 1, 4) # 行0,列0,跨1行4列
# 第一行控件
name_label = QLabel("姓名:")
grid.addWidget(name_label, 1, 0)
name_edit = QLineEdit()
grid.addWidget(name_edit, 1, 1, 1, 3) # 跨1行3列
# 第二行控件
age_label = QLabel("年龄:")
grid.addWidget(age_label, 2, 0)
age_edit = QLineEdit()
grid.addWidget(age_edit, 2, 1)
gender_label = QLabel("性别:")
grid.addWidget(gender_label, 2, 2)
gender_edit = QLineEdit()
grid.addWidget(gender_edit, 2, 3)
# 第三行:备注(跨2行)
note_label = QLabel("备注:")
grid.addWidget(note_label, 3, 0)
note_edit = QTextEdit()
grid.addWidget(note_edit, 3, 1, 2, 3) # 行3,列1,跨2行3列
# 按钮区域
ok_btn = QPushButton("确定")
grid.addWidget(ok_btn, 5, 2)
cancel_btn = QPushButton("取消")
grid.addWidget(cancel_btn, 5, 3)
# 设置行列伸缩因子(窗口大小变化时的拉伸比例)
grid.setColumnStretch(1, 2) # 第1列拉伸比例为2
grid.setColumnStretch(3, 1) # 第3列拉伸比例为1
grid.setRowStretch(3, 1) # 第3行拉伸比例为1
# 应用布局
self.setLayout(grid)
# 窗口设置
self.setWindowTitle('高级 GridLayout 示例')
self.setGeometry(300, 300, 500, 300) # 位置(x,y)和大小(w,h)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = AdvancedGridLayout()
sys.exit(app.exec_())
代码解释
布局创建
QGridLayout() 初始化网格布局,setSpacing(10) 设置控件间距为10像素。
添加控件
addWidget(widget, row, col):基本用法,将控件放在指定行列addWidget(widget, row, col, row_span, col_span):扩展用法,设置控件跨越的行数和列数(如标题跨4列,备注框跨2行3列)
伸缩控制
setColumnStretch(col, factor):设置列的拉伸因子,数值越大,窗口缩放时该列占比越大setRowStretch(row, factor):设置行的拉伸因子,类似列的设置
窗口适配
通过伸缩因子的设置,当用户调整窗口大小时,界面元素会按比例自动调整,保持良好的布局效果。