QFormLayout Class

QFormLayout 类管理输入部件的窗体及其相关标签。更多

Header: #include <QFormLayout>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承: QLayout

公共类型

struct TakeRowResult
enum FieldGrowthPolicy { FieldsStayAtSizeHint, ExpandingFieldsGrow, AllNonFixedFieldsGrow }
enum ItemRole { LabelRole, FieldRole, SpanningRole }
enum RowWrapPolicy { DontWrapRows, WrapLongRows, WrapAllRows }

属性

公共函数

QFormLayout(QWidget *parent = nullptr)
virtual ~QFormLayout()
void addRow(QWidget *label, QWidget *field)
void addRow(QLayout *layout)
void addRow(QWidget *widget)
void addRow(QWidget *label, QLayout *field)
void addRow(const QString &labelText, QLayout *field)
void addRow(const QString &labelText, QWidget *field)
QFormLayout::FieldGrowthPolicy fieldGrowthPolicy() const
Qt::Alignment formAlignment() const
void getItemPosition(int index, int *rowPtr, QFormLayout::ItemRole *rolePtr) const
void getLayoutPosition(QLayout *layout, int *rowPtr, QFormLayout::ItemRole *rolePtr) const
void getWidgetPosition(QWidget *widget, int *rowPtr, QFormLayout::ItemRole *rolePtr) const
int horizontalSpacing() const
void insertRow(int row, QWidget *label, QWidget *field)
void insertRow(int row, QLayout *layout)
void insertRow(int row, QWidget *widget)
void insertRow(int row, QWidget *label, QLayout *field)
void insertRow(int row, const QString &labelText, QLayout *field)
void insertRow(int row, const QString &labelText, QWidget *field)
(since 6.4) bool isRowVisible(int row) const
(since 6.4) bool isRowVisible(QLayout *layout) const
(since 6.4) bool isRowVisible(QWidget *widget) const
QLayoutItem *itemAt(int row, QFormLayout::ItemRole role) const
Qt::Alignment labelAlignment() const
QWidget *labelForField(QWidget *field) const
QWidget *labelForField(QLayout *field) const
void removeRow(int row)
void removeRow(QLayout *layout)
void removeRow(QWidget *widget)
int rowCount() const
QFormLayout::RowWrapPolicy rowWrapPolicy() const
void setFieldGrowthPolicy(QFormLayout::FieldGrowthPolicy policy)
void setFormAlignment(Qt::Alignment alignment)
void setHorizontalSpacing(int spacing)
void setItem(int row, QFormLayout::ItemRole role, QLayoutItem *item)
void setLabelAlignment(Qt::Alignment alignment)
void setLayout(int row, QFormLayout::ItemRole role, QLayout *layout)
(since 6.4) void setRowVisible(int row, bool on)
(since 6.4) void setRowVisible(QLayout *layout, bool on)
(since 6.4) void setRowVisible(QWidget *widget, bool on)
void setRowWrapPolicy(QFormLayout::RowWrapPolicy policy)
void setVerticalSpacing(int spacing)
void setWidget(int row, QFormLayout::ItemRole role, QWidget *widget)
QFormLayout::TakeRowResult takeRow(int row)
QFormLayout::TakeRowResult takeRow(QLayout *layout)
QFormLayout::TakeRowResult takeRow(QWidget *widget)
int verticalSpacing() const

重新实现的公共函数

virtual void addItem(QLayoutItem *item) override
virtual int count() const override
virtual Qt::Orientations expandingDirections() const override
virtual bool hasHeightForWidth() const override
virtual int heightForWidth(int width) const override
virtual void invalidate() override
virtual QLayoutItem *itemAt(int index) const override
virtual QSize minimumSize() const override
virtual void setGeometry(const QRect &rect) override
virtual void setSpacing(int spacing) override
virtual QSize sizeHint() const override
virtual int spacing() const override
virtual QLayoutItem *takeAt(int index) override

详细说明

QFormLayout 是一个方便的布局类,它以两栏形式布局其子类。左栏由标签组成,右栏由 "字段 "部件(行编辑器、旋转框等)组成。

传统上,这种双栏表单布局是通过QGridLayout 实现的。QFormLayout 是一种更高级别的替代方案,具有以下优点:

  • 符合不同平台的外观指南。

    例如,macOS Aqua和 KDE 指南规定标签应采用右对齐方式,而 Windows 和 GNOME 应用程序通常采用左对齐方式。

  • 支持包裹长行。

    对于显示屏较小的设备,QFormLayout 可以设置为wrap long rows ,甚至wrap all rows

  • 创建标签-字段对的便捷 API。

    addRow() 重载会接收一个QString 和一个QWidget * 在幕后创建一个QLabel 并自动设置其好友。这样,我们就可以编写这样的代码:

    QFormLayout *formLayout = new QFormLayout(this);
    formLayout->addRow(tr("&Name:"), nameLineEdit);
    formLayout->addRow(tr("&Email:"), emailLineEdit);
    formLayout->addRow(tr("&Age:"), ageSpinBox);

    将其与使用QGridLayout 编写的以下代码进行比较:

    QGridLayout *gridLayout = new QGridLayout(this);
    
    nameLabel = new QLabel(tr("&Name:"));
    nameLabel->setBuddy(nameLineEdit);
    
    emailLabel = new QLabel(tr("&Name:"));
    emailLabel->setBuddy(emailLineEdit);
    
    ageLabel = new QLabel(tr("&Name:"));
    ageLabel->setBuddy(ageSpinBox);
    
    gridLayout->addWidget(nameLabel, 0, 0);
    gridLayout->addWidget(nameLineEdit, 0, 1);
    gridLayout->addWidget(emailLabel, 1, 0);
    gridLayout->addWidget(emailLineEdit, 1, 1);
    gridLayout->addWidget(ageLabel, 2, 0);
    gridLayout->addWidget(ageSpinBox, 2, 1);

下表显示了不同样式下的默认外观。

QCommonStyle 派生样式(QPlastiqueStyle 除外)QMacStyleQPlastiqueStyleQt 扩展样式
用于 Windows、GNOME 和 KDE 早期版本的传统样式。标签左对齐,扩展字段不断扩大以填充可用空间。(这通常相当于我们使用双栏QGridLayout 时的效果)。基于macOS Aqua指南的样式。标签右对齐,字段不会超出其大小提示,表单水平居中。推荐用于 KDE 应用程序的样式。与 MacStyle 类似,但表单靠左对齐,所有字段都会增长以填充可用空间。Qt 扩展样式的默认样式。标签采用右对齐方式,扩展字段会增长以填充可用空间,长行会启用行包装。

也可以通过调用setLabelAlignment(),setFormAlignment(),setFieldGrowthPolicy() 和setRowWrapPolicy() 单独重写表单样式。例如,要在所有平台上模拟 QMacStyle 的表单布局外观,但标签要左对齐,你可以写下

formLayout->setRowWrapPolicy(QFormLayout::DontWrapRows);
formLayout->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
formLayout->setFormAlignment(Qt::AlignHCenter | Qt::AlignTop);
formLayout->setLabelAlignment(Qt::AlignLeft);

另请参见 QGridLayout,QBoxLayout, 和QStackedLayout

成员类型文档

enum QFormLayout::FieldGrowthPolicy

该枚举指定了可用于控制表单字段增长方式的不同策略。

常数说明
QFormLayout::FieldsStayAtSizeHint0字段永远不会超出其effective size hint 。这是 QMacStyle 的默认设置。
QFormLayout::ExpandingFieldsGrow1水平size policyExpandingMinimumExpanding 的字段将增长以填充可用空间。其他字段的增长不会超过其有效尺寸提示。这是 Plastique 的默认策略。
QFormLayout::AllNonFixedFieldsGrow2尺寸策略允许增长的所有字段都将增长以填充可用空间。这是大多数样式的默认策略。

另请参阅 fieldGrowthPolicy

enum QFormLayout::ItemRole

该枚举指定了可出现在一行中的部件(或其他布局项)类型。

常数描述
QFormLayout::LabelRole0标签部件。
QFormLayout::FieldRole1字段 widget。
QFormLayout::SpanningRole2跨越标签列和字段列的部件。

另请参阅 itemAt() 和getItemPosition()。

enum QFormLayout::RowWrapPolicy

该枚举指定了可用于控制表单行换行方式的不同策略。

常量说明
QFormLayout::DontWrapRows0字段总是紧靠标签排列。这是所有样式的默认策略,Qt 扩展样式除外。
QFormLayout::WrapLongRows1标签有足够的水平空间容纳最宽的标签,其余空间留给字段。如果字段对的最小尺寸大于可用空间,字段将被包装到下一行。这是 Qt 扩展样式的默认策略。
QFormLayout::WrapAllRows2字段始终位于标签下方。

另请参阅 rowWrapPolicy

属性文档

fieldGrowthPolicy : FieldGrowthPolicy

该属性表示表单字段的增长方式。

默认值取决于部件或应用程序样式。对于 QMacStyle,默认值为FieldsStayAtSizeHint ;对于QCommonStyle 派生样式(如 Plastique 和 Windows),默认值为ExpandingFieldsGrow ;对于 Qt XML Extended 样式,默认值为AllNonFixedFieldsGrow

如果所有字段都无法增长,而表单又被调整了大小,那么额外空间将根据当前form alignment 分配。

访问功能:

QFormLayout::FieldGrowthPolicy fieldGrowthPolicy() const
void setFieldGrowthPolicy(QFormLayout::FieldGrowthPolicy policy)

另请参阅 formAlignmentrowWrapPolicy

formAlignment : Qt::Alignment

该属性用于设置表单布局内容在布局几何图形中的对齐方式。

默认值取决于部件或应用程序样式。对于 QMacStyle,默认值为Qt::AlignHCenter |Qt::AlignTop ;对于其他样式,默认值为Qt::AlignLeft |Qt::AlignTop

访问函数:

Qt::Alignment formAlignment() const
void setFormAlignment(Qt::Alignment alignment)

另请参阅 labelAlignmentrowWrapPolicy

horizontalSpacing : int

该属性用于保存并排布局的 widget 之间的间距。

默认情况下,如果没有显式设置值,布局的水平间距将从父布局或父 widget 的样式设置中继承。

访问功能:

int horizontalSpacing() const
void setHorizontalSpacing(int spacing)

另请参阅 verticalSpacingQStyle::pixelMetric() 和PM_LayoutHorizontalSpacing

labelAlignment : Qt::Alignment

该属性用于设置标签的水平对齐方式。

默认值取决于部件或应用程序的样式。对于QCommonStyle 派生样式(QPlastiqueStyle 除外),默认值为Qt::AlignLeft ;对于其他样式,默认值为Qt::AlignRight

访问函数:

Qt::Alignment labelAlignment() const
void setLabelAlignment(Qt::Alignment alignment)

另请参阅 formAlignment

rowWrapPolicy : RowWrapPolicy

该属性用于设置表单行的换行方式。

默认值取决于部件或应用程序的样式。对于 Qt XML 扩展样式,默认值为WrapLongRows ;对于其他样式,默认值为DontWrapRows

如果您想将每个标签显示在相关字段的上方(而不是旁边),请将此属性设置为WrapAllRows

访问功能:

QFormLayout::RowWrapPolicy rowWrapPolicy() const
void setRowWrapPolicy(QFormLayout::RowWrapPolicy policy)

另请参阅 fieldGrowthPolicy

verticalSpacing : int

该属性用于保存垂直布局的 widget 之间的间距。

默认情况下,如果没有显式设置值,布局的垂直间距将从父布局或父 widget 的样式设置中继承。

访问功能:

int verticalSpacing() const
void setVerticalSpacing(int spacing)

另请参阅 horizontalSpacingQStyle::pixelMetric() 和PM_LayoutHorizontalSpacing

成员函数文档

[explicit] QFormLayout::QFormLayout(QWidget *parent = nullptr)

使用给定的parent widget 构建一个新的表单布局。

该布局将直接设置为parent 的顶级布局。一个 widget 只能有一个顶级布局。它由QWidget::layout() 返回。

另请参阅 QWidget::setLayout()。

[virtual noexcept] QFormLayout::~QFormLayout()

销毁表格布局。

[override virtual] void QFormLayout::addItem(QLayoutItem *item)

重实现:QLayout::addItem(QLayoutItem *item).

void QFormLayout::addRow(QWidget *label, QWidget *field)

在此表单布局的底部添加新的一行,行号为labelfield

另请参见 insertRow()。

void QFormLayout::addRow(QLayout *layout)

这是一个重载函数。

在此表单布局的末尾添加指定的layoutlayout 跨两列。

void QFormLayout::addRow(QWidget *widget)

这是一个重载函数。

在此表单布局的末尾添加指定的widgetwidget 跨两列。

void QFormLayout::addRow(QWidget *label, QLayout *field)

这是一个重载函数。

void QFormLayout::addRow(const QString &labelText, QLayout *field)

这是一个重载函数。

该重载函数会在后台自动创建一个QLabel ,文本为labelText

void QFormLayout::addRow(const QString &labelText, QWidget *field)

这是一个重载函数。

该重载会在后台自动创建一个QLabel ,其文本为labelTextfield 将被设置为新的QLabelbuddy

[override virtual] int QFormLayout::count() const

重实现:QLayout::count() const.

[override virtual] Qt::Orientations QFormLayout::expandingDirections() const

重实现:QLayout::expandingDirections() const.

void QFormLayout::getItemPosition(int index, int *rowPtr, QFormLayout::ItemRole *rolePtr) const

读取指定index 项目的行和角色(列)。如果index 越界,则 *rowPtr 设置为-1;否则,行存储在 *rowPtr 中,角色存储在 *rolePtr 中。

另请参阅 itemAt(),count(),getLayoutPosition() 和getWidgetPosition() 。

void QFormLayout::getLayoutPosition(QLayout *layout, int *rowPtr, QFormLayout::ItemRole *rolePtr) const

读取指定子layout 的行和角色(列)。如果layout 不在表单布局中,则 *rowPtr 设置为-1;否则,行存储在 *rowPtr 中,角色存储在 *rolePtr 中。

void QFormLayout::getWidgetPosition(QWidget *widget, int *rowPtr, QFormLayout::ItemRole *rolePtr) const

读取布局中指定widget 的行和角色(列)。如果widget 不在布局中,*rowPtr 将被设置为-1;否则,行存储在 *rowPtr 中,角色存储在 *rolePtr 中。

另请参阅 getItemPosition() 和itemAt() 。

[override virtual] bool QFormLayout::hasHeightForWidth() const

重实现:QLayoutItem::hasHeightForWidth() const.

[override virtual] int QFormLayout::heightForWidth(int width) const

重实现:QLayoutItem::heightForWidth(int) const.

void QFormLayout::insertRow(int row, QWidget *label, QWidget *field)

在此表格布局中的row 位置插入新行,给定的labelfield 。如果row 越界,则在末尾添加新行。

另请参见 addRow()。

void QFormLayout::insertRow(int row, QLayout *layout)

这是一个重载函数。

在此表单布局的row 位置插入指定的layoutlayout 跨两列。如果row 越界,则在末尾添加 widget。

void QFormLayout::insertRow(int row, QWidget *widget)

这是一个重载函数。

在此表单布局的row 位置插入指定的widgetwidget 跨两列。如果row 越界,则在末尾添加 widget。

void QFormLayout::insertRow(int row, QWidget *label, QLayout *field)

这是一个重载函数。

void QFormLayout::insertRow(int row, const QString &labelText, QLayout *field)

这是一个重载函数。

该重载函数会在后台自动创建一个QLabel ,文本为labelText

void QFormLayout::insertRow(int row, const QString &labelText, QWidget *field)

这是一个重载函数。

该重载会在后台自动创建一个QLabel ,其文本为labelTextfield 将被设置为新的QLabelbuddy

[override virtual] void QFormLayout::invalidate()

重新实现:QLayout::invalidate().

[since 6.4] bool QFormLayout::isRowVisible(int row) const

如果行row 中的某些项目可见,则返回 true,否则返回 false。

此函数在 Qt 6.4 中引入。

[since 6.4] bool QFormLayout::isRowVisible(QLayout *layout) const

这是一个重载函数。

如果layout 所对应行中的某些项目可见,则返回 true,否则返回 false。

此函数在 Qt 6.4 中引入。

[since 6.4] bool QFormLayout::isRowVisible(QWidget *widget) const

这是一个重载函数。

如果widget 所对应行中的某些项目可见,则返回 true,否则返回 false。

此函数在 Qt 6.4 中引入。

[override virtual] QLayoutItem *QFormLayout::itemAt(int index) const

重实现:QLayout::itemAt(int index) const.

QLayoutItem *QFormLayout::itemAt(int row, QFormLayout::ItemRole role) const

返回row 中指定role (列)的布局项。如果没有布局项,则返回nullptr

另请参阅 QLayout::itemAt() 和setItem()。

QWidget *QFormLayout::labelForField(QWidget *field) const

返回与给定field 相关的标签。

另请参阅 itemAt() 。

QWidget *QFormLayout::labelForField(QLayout *field) const

这是一个重载函数。

[override virtual] QSize QFormLayout::minimumSize() const

重实现:QLayout::minimumSize() const.

void QFormLayout::removeRow(int row)

从表格布局中删除行row

row 必须为非负数,且小于 ()。rowCount

调用后,rowCount() 将递减 1。占用该行的所有部件和嵌套布局都将被删除。这包括字段部件和标签(如果有)。所有后续行将上移一行,腾出的垂直空间将重新分配给其余各行。

您可以使用该函数撤销之前的addRow() 或insertRow():

QFormLayout *flay = ...;
QPointer<QLineEdit> le = new QLineEdit;
flay->insertRow(2, "User:", le);
// later:
flay->removeRow(2); // le == nullptr at this point

如果想在不删除部件的情况下从布局中删除行,请使用takeRow() 代替。

另请参见 takeRow()。

void QFormLayout::removeRow(QLayout *layout)

这是一个重载函数。

从表单布局中删除与layout 对应的行。

调用后,rowCount() 将递减 1。占用该行的所有部件和嵌套布局都将被删除。这包括字段部件和标签(如果有)。所有后续行将上移一行,腾出的垂直空间将重新分配给其余各行。

您可以使用该函数撤销之前的addRow() 或insertRow():

QFormLayout *flay = ...;
QPointer<QVBoxLayout> vbl = new QVBoxLayout;
flay->insertRow(2, "User:", vbl);
// later:
flay->removeRow(layout); // vbl == nullptr at this point

如果要从表单布局中删除行而不删除插入的布局,请使用takeRow() 代替。

另请参见 takeRow()。

void QFormLayout::removeRow(QWidget *widget)

这是一个重载函数。

从表单布局中删除与widget 对应的行。

调用后,rowCount() 将递减 1。占用该行的所有部件和嵌套布局都将被删除。这包括字段部件和标签(如果有)。所有后续行将上移一行,腾出的垂直空间将重新分配给其余各行。

您可以使用该函数撤销之前的addRow() 或insertRow():

QFormLayout *flay = ...;
QPointer<QLineEdit> le = new QLineEdit;
flay->insertRow(2, "User:", le);
// later:
flay->removeRow(le); // le == nullptr at this point

如果想在不删除部件的情况下从布局中删除行,请使用takeRow() 代替。

另请参见 takeRow()。

int QFormLayout::rowCount() const

返回表格的行数。

另请参阅 QLayout::count()。

[override virtual] void QFormLayout::setGeometry(const QRect &rect)

重实现:QLayout::setGeometry(const QRect &r).

void QFormLayout::setItem(int row, QFormLayout::ItemRole role, QLayoutItem *item)

将给定row 中的项目设置为给定roleitem ,必要时用空行扩展布局。

如果单元格已被占用,则不会插入item ,并向控制台发送错误信息。item 跨两列。

警告 请勿使用此函数添加子布局或子部件项。请使用setLayout() 或setWidget() 代替。

另请参阅 setLayout()。

void QFormLayout::setLayout(int row, QFormLayout::ItemRole role, QLayout *layout)

row 中给定role 的子布局设置为layout ,必要时用空行扩展表单布局。

如果单元格已被占用,则不会插入layout ,并向控制台发送错误信息。

注:对于大多数应用程序,应使用addRow() 或insertRow() 代替 setLayout()。

另请参阅 setWidget()。

[since 6.4] void QFormLayout::setRowVisible(int row, bool on)

如果on 为真,则显示行row ,否则隐藏该行。

row 必须是非负值,且小于 ()。rowCount

此函数在 Qt 6.4 中引入。

另请参阅 isRowVisible()、removeRow() 和takeRow()。

[since 6.4] void QFormLayout::setRowVisible(QLayout *layout, bool on)

这是一个重载函数。

如果on 为 true,则显示与layout 对应的行,否则隐藏该行。

此函数在 Qt 6.4 中引入。

另请参阅 removeRow() 和takeRow()。

[since 6.4] void QFormLayout::setRowVisible(QWidget *widget, bool on)

这是一个重载函数。

如果on 为 true,则显示与widget 对应的行,否则隐藏该行。

此函数在 Qt 6.4 中引入。

另请参阅 removeRow() 和takeRow()。

[override virtual] void QFormLayout::setSpacing(int spacing)

重构属性访问函数:QLayout::spacing

该函数将垂直和水平间距都设置为spacing

另请参见 spacing()、setVerticalSpacing() 和setHorizontalSpacing()。

void QFormLayout::setWidget(int row, QFormLayout::ItemRole role, QWidget *widget)

row 中给定role 的 widget 设置为widget ,必要时用空行扩展布局。

如果单元格已被占用,则不会插入widget ,并向控制台发送错误信息。

注:对于大多数应用程序,应使用addRow() 或insertRow() 代替 setWidget()。

另请参阅 setLayout()。

[override virtual] QSize QFormLayout::sizeHint() const

重实现:QLayoutItem::sizeHint() const.

[override virtual] int QFormLayout::spacing() const

重新实现属性:QLayout::spacing 的访问函数。

如果垂直间距等于水平间距,该函数返回该值;否则返回-1。

另请参见 setSpacing()、verticalSpacing() 和horizontalSpacing()。

[override virtual] QLayoutItem *QFormLayout::takeAt(int index)

重实现:QLayout::takeAt(int index)。

QFormLayout::TakeRowResult QFormLayout::takeRow(int row)

从该表格布局中删除指定的row

row 必须为非负数且小于 ().rowCount

注意: 此函数不会删除任何内容。

调用此函数后,rowCount() 将递减 1。所有后续行将上移一行,腾出的垂直空间将重新分配给其余各行。

您可以使用该函数撤销之前的addRow() 或insertRow():

QFormLayout *flay = ...;
QPointer<QLineEdit> le = new QLineEdit;
flay->insertRow(2, "User:", le);
// later:
QFormLayout::TakeRowResult result = flay->takeRow(2);

如果想从布局中移除该行并删除部件,请使用removeRow() 代替。

返回 包含部件和相应标签布局项的结构

另请参见 removeRow()。

QFormLayout::TakeRowResult QFormLayout::takeRow(QLayout *layout)

这是一个重载函数。

从该表单布局中删除指定的layout

注意: 此函数不会删除任何内容。

调用此函数后,rowCount() 将递减 1。所有后续行将上移一行,腾出的垂直空间将重新分配给其余各行。

QFormLayout *flay = ...;
QPointer<QVBoxLayout> vbl = new QVBoxLayout;
flay->insertRow(2, "User:", vbl);
// later:
QFormLayout::TakeRowResult result = flay->takeRow(widget);

如果要从表单布局中移除该行并删除插入的布局,请使用removeRow() 代替。

返回包含部件和相应标签布局项的结构

另请参见 removeRow()。

QFormLayout::TakeRowResult QFormLayout::takeRow(QWidget *widget)

这是一个重载函数。

从该表单布局中删除指定的widget

注意: 此函数不会删除任何内容。

调用此函数后,rowCount() 将递减 1。所有后续行将上移一行,腾出的垂直空间将重新分配给其余各行。

QFormLayout *flay = ...;
QPointer<QLineEdit> le = new QLineEdit;
flay->insertRow(2, "User:", le);
// later:
QFormLayout::TakeRowResult result = flay->takeRow(widget);

如果想从布局中删除该行并删除部件,请使用removeRow() 代替。

返回包含部件和相应标签布局项的结构

另请参见 removeRow()。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.