一、描述
表单布局。是一个方便的布局类,它以两列形式布置其子项。左列由标签组成,右列由“字段”小部件(行编辑器、微调框等)组成。
两列布局时使用 QFormLayout 比 QGridLayout 更加方便。
QFormLayout *formLayout = new QFormLayout;
formLayout->addRow(tr("&Name:"), nameLineEdit);
formLayout->addRow(tr("&Email:"), emailLineEdit);
formLayout->addRow(tr("&Age:"), ageSpinBox);
setLayout(formLayout);
上面的代码如果使用QGridLayout :
nameLabel = new QLabel(tr("&Name:"));
nameLabel->setBuddy(nameLineEdit);
emailLabel = new QLabel(tr("&Name:"));
emailLabel->setBuddy(emailLineEdit);
ageLabel = new QLabel(tr("&Name:"));
ageLabel->setBuddy(ageSpinBox);
QGridLayout *gridLayout = new QGridLayout;
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);
setLayout(gridLayout);
二、类型成员
1、enum QFormLayout::FieldGrowthPolicy:此枚举指定用于控制表单字段增长方式的策略。
- FieldsStayAtSizeHint:字段永远不会超出其有效大小提示(QWidgetItem::sizeHint())。
- ExpandingFieldsGrow:水平大小策略为 Expanding 或 MinimumExpanding 的字段将增长以填充可用空间。其他字段不会超出其有效大小提示。
- AllNonFixedFieldsGrow:所有具有允许它们增长的大小策略的字段将增长以填充可用空间。 这是大多数样式的默认策略。
2、enum QFormLayout::ItemRole:此枚举指定可能连续出现的布局项的类型。
- LabelRole:标签小部件。
- FieldRole:字段小部件。
- SpanningRole:跨越标签和字段列的小部件。
3、enum QFormLayout::RowWrapPolicy:此枚举指定控制换行方式的策略。
- DontWrapRows:字段总是排列在它们的标签旁边。
- WrapLongRows:标签被给予足够的水平空间以适应最宽的标签,其余的空间被给予字段。 如果所有字段中的最小大小大于可用空间,则该字段将换行到下一行。
- WrapAllRows:字段总是在它们的标签下方。
三、属性成员
1、fieldGrowthPolicy : FieldGrowthPolicy
字段增长的方式。
默认值取决于小部件或应用程序样式。对于 QMacStyle,默认为 FieldsStayAtSizeHint;对于 QCommonStyle 派生样式,默认为 ExpandingFieldsGrow; 对于 Qt 扩展样式,默认值为 AllNonFixedFieldsGrow。
如果没有一个字段可以增长并且调整大小,则会根据当前的对齐方式分配额外的空间。
2、formAlignment : Qt::Alignment
表单布局内容的对齐方式。
默认值取决于小部件或应用程序样式。对于 QMacStyle,默认为 Qt::AlignHCenter | Qt::AlignTop; 对于其他样式,默认为 Qt::AlignLeft | Qt::AlignTop。
3、horizontalSpacing : int / verticalSpacing : int
并排的小部件的间距。
默认情况下,如果没有显式设置值,则布局的水平间距继承自父布局,或者继承自父窗口小部件的样式设置。
4、labelAlignment : Qt::Alignment
标签的水平对齐方式。
默认值取决于小部件或应用程序样式。对于 QCommonStyle 派生样式,默认是Qt::AlignLeft;对于其他样式,默认为 Qt::AlignRight。
5、rowWrapPolicy : RowWrapPolicy
表单布局的行的换行方式。
默认值取决于小部件或应用程序样式。对于 Qt 扩展样式,默认为 WrapLongRows;对于其他样式,默认为 DontWrapRows。
如果要在其关联字段上方(而不是旁边)显示每个标签,应将此属性设置为 WrapAllRows。
四、成员函数
1、void addRow(QWidget *label, QWidget *field)
void addRow(QWidget *label, QLayout *field)
使用给定的标签和字段在此表单布局的底部添加一个新行。
void addRow(const QString &labelText, QWidget *field)
void addRow(const QString &labelText, QLayout *field)
会在后台自动创建一个 QLabel,其中 labelText 作为其文本。
void addRow(QWidget *widget)
void addRow(QLayout *layout)
在此表单布局的末尾添加指定的小部件/布局。小部件/布局跨越两列。
2、void getItemPosition(int index, int *rowPtr, QFormLayout::ItemRole *rolePtr)
在 index 处检索项目的行和角色(列)。如果索引超出范围,*rowPtr 设置为 -1;否则,该行存储在 *rowPtr 中,而角色存储在 *rolePtr 中。
void getLayoutPosition(QLayout *layout, int *rowPtr, QFormLayout::ItemRole *rolePtr)
检索指定子布局的行和角色(列)。如果 layout 不在表单布局中,*rowPtr 设置为 -1;否则,该行存储在 *rowPtr 中,而角色存储在 *rolePtr 中。
void getWidgetPosition(QWidget *widget, int *rowPtr, QFormLayout::ItemRole *rolePtr)
检索布局中指定小部件的行和角色(列)。如果小部件不在布局中,*rowPtr 设置为 -1;否则,该行存储在 *rowPtr 中,而角色存储在 *rolePtr 中。
3、void insertRow(int row, QWidget *label, QWidget *field)
void insertRow(int row, QWidget *label, QLayout *field)
void insertRow(int row, const QString &labelText, QWidget *field)
void insertRow(int row, const QString &labelText, QLayout *field)
在此表单布局中的 row 位置插入一个新行,具有给定的标签和字段。如果row超出范围,则在末尾添加新行。
void insertRow(int row, QWidget *widget)
void insertRow(int row, QLayout *layout)
重载函数。小部件跨越两列。
4、QLayoutItem * itemAt(int row, QFormLayout::ItemRole role)
返回给定行中具有指定角色(列)的布局项。
5、QWidget * labelForField(QWidget *field)
QWidget * labelForField(QLayout *field)
返回与给定字段关联的标签。
6、void removeRow(int row)
从表单布局中删除第row行。
调用之后, rowCount() 减一。占用该行的所有小部件和嵌套布局都将被删除。
如果要从布局中删除行而不删除小部件,应改用 takeRow()。
void removeRow(QWidget *widget)
void removeRow(QLayout *layout)
从表单布局中删除与小部件/布局对应的行。
7、int rowCount()
返回表单中的行数。
8、void setItem(int row, QFormLayout::ItemRole role, QLayoutItem *item)
将 row 行中的 role 设置为 item,必要时使用空行扩展布局。
请勿使用此功能添加子布局或子小部件项目。请改用 setLayout() 或 setWidget()。
void setLayout(int row, QFormLayout::ItemRole role, QLayout *layout)
void setWidget(int row, QFormLayout::ItemRole role, QWidget *widget)
将 row 行中的 role 设置为 layout / widget,必要时使用空行扩展表单布局。
对于大多数应用程序,应使用 addRow() 或 insertRow() 而不是 setLayout() / setWidget()。
9、void setSpacing(int spacing)
将垂直和水平间距都设置为 spacing。
10、QFormLayout::TakeRowResult takeRow(int row)
QFormLayout::TakeRowResult takeRow(QWidget *widget)
QFormLayout::TakeRowResult takeRow(QLayout *layout)
从表单布局中移除指定的内容。注意:此功能不会删除任何内容。
如果要从布局中删除行并删除小部件,请改用 removeRow()。
在此调用之后, rowCount() 减一。 所有随后的行都向上移动一行,并且释放的垂直空间在剩余的行中重新分配。
返回包含小部件和相应标签布局项的结构。