QVBoxLayout
是 PyQt5 中用于垂直排列子控件的布局管理器,属于 PyQt5 布局系统的核心组件。它将子控件按从上到下的顺序依次排列,并自动处理控件的位置和尺寸调整,是构建整洁用户界面的重要工具。以下是详细介绍及常用方法:
一、核心功能
- 垂直排列:控件按纵向顺序堆叠。
- 自适应尺寸:根据父容器尺寸动态调整子控件大小。
- 间距控制:统一设置控件之间的间隔和布局边距。
- 对齐方式:控制子控件在布局中的对齐位置。
- 嵌套布局:支持与其他布局(如
QHBoxLayout
)组合使用,构建复杂界面。
二、常用方法
1. 创建与基础操作
方法 | 说明 | 示例 |
---|---|---|
QVBoxLayout() | 构造函数 | layout = QVBoxLayout() |
addWidget(widget: QWidget, stretch: int = 0, alignment: Qt.Alignment = 0) | 添加控件 | layout.addWidget(button) |
addLayout(layout: QLayout, stretch: int = 0) | 添加子布局 | layout.addLayout(sub_layout) |
addStretch(stretch: int = 0) | 添加伸缩空白区域 | layout.addStretch(1) |
addSpacing(size: int) | 添加固定高度的空白 | layout.addSpacing(20) |
removeWidget(widget: QWidget) | 移除控件 | layout.removeWidget(button) |
2. 边距与间距
方法 | 说明 | 示例 |
---|---|---|
setContentsMargins(left: int, top: int, right: int, bottom: int) | 设置布局边距 | layout.setContentsMargins(10, 5, 10, 5) |
setSpacing(spacing: int) | 设置控件之间的间隔 | layout.setSpacing(10) |
3. 对齐方式
方法 | 说明 | 示例 |
---|---|---|
setAlignment(alignment: Qt.Alignment) | 设置所有子控件的对齐方式 | layout.setAlignment(Qt.AlignLeft) |
setAlignment(widget: QWidget, alignment: Qt.Alignment) | 设置单个控件的对齐方式 | layout.setAlignment(button, Qt.AlignRight) |
三、代码示例
1. 基础垂直布局
python
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QApplication
class Demo(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout(self) # 创建布局并绑定到当前窗口
# 添加控件
btn1 = QPushButton("按钮1")
btn2 = QPushButton("按钮2")
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.setSpacing(10) # 控件间隔10像素
layout.setContentsMargins(20, 20, 20, 20) # 布局边距
self.setWindowTitle("垂直布局示例")
self.resize(300, 200)
app = QApplication([])
window = Demo()
window.show()
app.exec_()
2. 嵌套布局(垂直 + 水平)
python
from PyQt5.QtWidgets import QHBoxLayout, QLineEdit
class FormDemo(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout(self)
# 水平布局嵌套在垂直布局中
h_layout = QHBoxLayout()
name_edit = QLineEdit(placeholderText="用户名")
age_edit = QLineEdit(placeholderText="年龄")
h_layout.addWidget(name_edit)
h_layout.addWidget(age_edit)
# 添加到垂直布局
layout.addLayout(h_layout)
layout.addWidget(QPushButton("提交"))
3. 动态添加/移除控件
python
class DynamicLayout(QWidget):
def __init__(self):
super().__init__()
self.layout = QVBoxLayout(self)
self.btn_add = QPushButton("添加控件", clicked=self.add_item)
self.layout.addWidget(self.btn_add)
def add_item(self):
new_btn = QPushButton(f"按钮{self.layout.count()}")
self.layout.addWidget(new_btn)
new_btn.clicked.connect(lambda: self.layout.removeWidget(new_btn))
四、常用技巧
1. 控制控件占位比例
通过 stretch
参数分配剩余空间:
python
layout.addWidget(btn1, stretch=1) # 占1份空间
layout.addWidget(btn2, stretch=2) # 占2份空间
2. 顶部/底部固定控件
用 addStretch
控制控件位置:
python
layout.addWidget(top_btn)
layout.addStretch(1) # 中间伸缩区域
layout.addWidget(bottom_btn)
3. 对齐方式示例
python
# 所有控件左对齐
layout.setAlignment(Qt.AlignLeft)
# 单个按钮右对齐
layout.setAlignment(button, Qt.AlignRight)
五、注意事项
-
布局必须绑定到父控件:
通过QWidget.setLayout(layout)
或构造函数传递父控件(如QVBoxLayout(parent)
)。 -
避免重复设置布局:
一个控件只能属于一个布局,重复添加会导致错误。 -
动态调整需刷新界面:
动态添加/移除控件后,调用update()
或adjustSize()
刷新显示。 -
边距与间距区别:
setContentsMargins
控制布局与父容器的边距;setSpacing
控制子控件之间的间隔。
六、与其他布局对比
QVBoxLayout | QHBoxLayout | QGridLayout |
---|---|---|
垂直排列控件 | 水平排列控件 | 网格排列控件(多行多列) |
简单线性布局 | 简单线性布局 | 复杂二维布局 |
适合表单、列表 | 适合工具栏、按钮行 | 适合表格、棋盘类布局 |
通过 QVBoxLayout
,可以快速实现垂直方向的自适应布局,结合嵌套和伸缩因子,轻松应对复杂界面需求!