QFormLayout类详细介绍

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所有非固定大小的控件都扩展

五、注意事项

  1. 标签关联控件
    使用 QLabel.setBuddy(field) 让标签的快捷键聚焦到对应控件(如 &用户名: 对应 Alt+U)。

  2. 动态更新表单
    动态增删行时,建议在修改布局后调用 update() 或 adjustSize() 刷新界面。

  3. 跨平台差异
    不同操作系统下换行策略的视觉效果可能略有不同,需测试验证。

  4. 表单验证
    可结合 QValidator 对输入控件进行格式校验(如邮箱、电话号码)。


六、与其他布局对比

QFormLayoutQGridLayoutQVBoxLayout
专为标签-控件对设计适合任意网格布局适合垂直排列的简单控件
自动处理对齐与换行需手动指定行列和跨度仅支持单列排列
适合登录、注册等表单场景适合仪表盘、复杂表格适合列表、工具栏

通过 QFormLayout,可以快速构建整齐的表单界面,减少手动对齐和位置计算的繁琐工作,显著提升开发效率!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值