PySide6-QLayout


前言:什么是布局管理器?

布局管理器是 PySide6 中控制控件排版与尺寸的核心机制。它们不继承自 QWidget(不是视觉控件),而是继承自 QLayout。布局管理器接管控件的几何计算,让你无需手写 move()resize(),完美实现界面自适应。


一、 基类:QLayout —— 所有布局的抽象基类

导入from PySide6.QtWidgets import QLayout
作为一个抽象类,一般不直接实例化,但它的通用属性贯穿所有后续子布局。


二、 直系子类:QBoxLayout —— 盒子布局(线性基类)

导入from PySide6.QtWidgets import QBoxLayout
由于 QVBoxLayoutQHBoxLayout 几乎一模一样,它们共同继承自 QBoxLayout,这里收纳了它们共同的核心方法。


三、 QVBoxLayout —— 垂直布局 & QHBoxLayout —— 水平布局

导入from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout
这两个类直接继承自 QBoxLayout,除了构造函数不同,所有方法完全继承自上面的 QBoxLayout


四、 QGridLayout —— 网格布局

导入from PySide6.QtWidgets import QGridLayout
将空间划分为网格(行和列),允许指定控件跨越多个行和列。


五、 QFormLayout —— 表单布局

导入from PySide6.QtWidgets import QFormLayout
专门为“标签 + 输入框”这种两列排版设计的布局,自动左对齐标签、右对齐输入框。


六、 QSizePolicy —— 控件尺寸策略(布局对控件的约束契约)

导入from PySide6.QtWidgets import QSizePolicy
布局之所以能拉伸或压缩一个控件,是因为控件自身带有 QSizePolicy。如果某个按钮死活拉伸不了,一定是它的策略没设对。

用法示例:

btn = QPushButton("固定按钮")
# 构造一个水平/垂直都固定的策略
sp = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
btn.setSizePolicy(sp)

七、 高阶实战:嵌套布局范例(商业软件标配)

90% 的界面的终极形态,都是垂直布局包裹水平布局,再包裹网格。

from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTextEdit, QGridLayout

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        
        # 1. 主容器:垂直布局
        main_layout = QVBoxLayout(self)
        
        # 2. 顶部工具栏:水平布局
        top_layout = QHBoxLayout()
        top_layout.addWidget(QPushButton("新建"))
        top_layout.addWidget(QPushButton("保存"))
        top_layout.addStretch()          # 弹簧把前面按钮挤到左边
        top_layout.addWidget(QPushButton("关于"))
        main_layout.addLayout(top_layout) # 嵌入主容器
        
        # 3. 中间功能区:网格布局
        grid = QGridLayout()
        grid.addWidget(QPushButton("功能A"), 0, 0)
        grid.addWidget(QPushButton("功能B"), 0, 1)
        grid.addWidget(QTextEdit(), 1, 0, 1, 2) # 一个文本框占满下方两列
        main_layout.addLayout(grid)
        
        # 4. 底部状态栏:水平布局
        bottom_layout = QHBoxLayout()
        bottom_layout.addStretch()
        bottom_layout.addWidget(QPushButton("退出"))
        main_layout.addLayout(bottom_layout)

八、 布局类补充遗漏细节


PySide6-QLayout