QFormLayout
是 PyQt5 中专门用于构建表单布局的组件,适用于标签(Label)与输入控件(如输入框、下拉框)成对排列的场景。它自动处理标签和输入控件的对齐与间距,简化了表单界面的开发流程。以下是详细介绍及常用方法:
一、核心功能
- 标签-控件对:自动将标签和输入控件成对排列。
- 自适应布局:根据窗口大小自动调整换行策略(如标签在上或左侧)。
- 对齐管理:统一设置标签和输入控件的对齐方式。
- 灵活扩展:支持动态添加、插入或删除表单行。
- 跨平台一致性:适配不同操作系统的原生表单样式。
二、常用方法
1. 添加表单行
方法 | 说明 | 示例 |
---|---|---|
addRow(label: QWidget, field: QWidget) | 添加标签和控件对 | layout.addRow(QLabel("用户名:"), QLineEdit()) |
addRow(labelText: str, field: QWidget) | 直接通过文本创建标签 | layout.addRow("密码:", QLineEdit()) |
addRow(widget: QWidget) | 添加独占一行的控件(如按钮) | layout.addRow(QPushButton("提交")) |
2. 插入与移除行
方法 | 说明 | 示例 |
---|---|---|
insertRow(row: int, label: QWidget, field: QWidget) | 在指定位置插入行 | layout.insertRow(1, QLabel("年龄:"), QLineEdit()) |
removeRow(widget: QWidget) | 移除包含指定控件的行 | layout.removeRow(line_edit) |
3. 布局配置
方法 | 说明 | 示例 |
---|---|---|
setRowWrapPolicy(policy: QFormLayout.RowWrapPolicy) | 设置标签与控件的换行方式 | layout.setRowWrapPolicy(QFormLayout.WrapAllRows) |
setLabelAlignment(alignment: Qt.Alignment) | 设置所有标签的对齐方式 | layout.setLabelAlignment(Qt.AlignRight) |
setFieldGrowthPolicy(policy: QFormLayout.FieldGrowthPolicy) | 设置输入控件的扩展策略 | layout.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) |
setFormAlignment(alignment: Qt.Alignment) | 设置整个表单的对齐方式 | layout.setFormAlignment(Qt.AlignCenter) |
4. 边距与间距
方法 | 说明 | 示例 |
---|---|---|
setContentsMargins(left, top, right, bottom) | 设置布局边距 | layout.setContentsMargins(10, 5, 10, 5) |
setHorizontalSpacing(spacing: int) | 设置标签与输入控件的水平间距 | layout.setHorizontalSpacing(20) |
setVerticalSpacing(spacing: int) | 设置行与行之间的垂直间距 | layout.setVerticalSpacing(15) |
三、代码示例
1. 基础表单(标签在左)
python
from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QPushButton, QApplication
class LoginForm(QWidget):
def __init__(self):
super().__init__()
layout = QFormLayout(self)
# 添加标签-控件对
self.username = QLineEdit()
layout.addRow("用户名:", self.username)
self.password = QLineEdit(echoMode=QLineEdit.Password)
layout.addRow("密码:", self.password)
# 添加独占行的按钮
submit_btn = QPushButton("登录")
layout.addRow(submit_btn)
self.setWindowTitle("登录表单")
self.resize(300, 150)
app = QApplication([])
window = LoginForm()
window.show()
app.exec_()
2. 动态插入行与换行策略
python
class DynamicForm(QWidget):
def __init__(self):
super().__init__()
self.layout = QFormLayout(self)
self.layout.setRowWrapPolicy(QFormLayout.WrapAllRows) # 标签在上,控件在下
# 动态添加行
self.add_btn = QPushButton("添加字段", clicked=self.add_field)
self.layout.addRow(self.add_btn)
def add_field(self):
row_count = self.layout.rowCount()
new_label = QLabel(f"字段{row_count}:")
new_input = QLineEdit()
self.layout.insertRow(row_count - 1, new_label, new_input) # 在按钮前插入
3. 标签与控件对齐
python
class AlignedForm(QWidget):
def __init__(self):
super().__init__()
layout = QFormLayout(self)
layout.setLabelAlignment(Qt.AlignRight) # 标签右对齐
layout.addRow("姓名:", QLineEdit())
layout.addRow("邮箱:", QLineEdit())
layout.setFormAlignment(Qt.AlignHCenter) # 表单整体居中对齐
四、布局策略枚举
1. 换行策略(RowWrapPolicy)
枚举值 | 说明 |
---|---|
QFormLayout.DontWrapRows | 标签始终在左侧,控件在右侧(不换行) |
QFormLayout.WrapLongRows | 空间不足时,标签在上,控件在下(自动换行) |
QFormLayout.WrapAllRows | 所有行的标签都在控件上方 |
2. 字段扩展策略(FieldGrowthPolicy)
枚举值 | 说明 |
---|---|
QFormLayout.FieldsStayAtSizeHint | 输入控件不扩展,保持默认大小 |
QFormLayout.ExpandingFieldsGrow | 输入控件水平扩展以填充空间 |
QFormLayout.AllNonFixedFieldsGrow | 所有非固定大小的控件都扩展 |
五、注意事项
-
标签关联控件:
使用QLabel.setBuddy(field)
让标签的快捷键聚焦到对应控件(如&用户名:
对应Alt+U
)。 -
动态更新表单:
动态增删行时,建议在修改布局后调用update()
或adjustSize()
刷新界面。 -
跨平台差异:
不同操作系统下换行策略的视觉效果可能略有不同,需测试验证。 -
表单验证:
可结合QValidator
对输入控件进行格式校验(如邮箱、电话号码)。
六、与其他布局对比
QFormLayout | QGridLayout | QVBoxLayout |
---|---|---|
专为标签-控件对设计 | 适合任意网格布局 | 适合垂直排列的简单控件 |
自动处理对齐与换行 | 需手动指定行列和跨度 | 仅支持单列排列 |
适合登录、注册等表单场景 | 适合仪表盘、复杂表格 | 适合列表、工具栏 |
通过 QFormLayout
,可以快速构建整齐的表单界面,减少手动对齐和位置计算的繁琐工作,显著提升开发效率!