文章目录
QFormLayout 类
QFormLayout类管理输入小部件的表单及其相关标签。
Header: | #include < QFormLayout > |
---|---|
qmake: | QT += widgets |
Inherits: | QLayout |
Inherited By: |
详细说明
QFormLayout是一个便捷的布局类,以两列的形式布局其子级。 左列包含标签,右列包含“字段”窗口小部件(行编辑器,旋转框等)。
传统上,这种两列表单布局是使用QGridLayout实现的。 QFormLayout是更高级别的替代方案,具有以下优点:
-
遵守不同平台的外观和感觉准则。
例如,macOS Aqua和KDE准则指定标签应右对齐,而Windows和GNOME应用程序通常使用左对齐。 -
支持包装长行。
对于具有小显示器的设备,可以将QFormLayout设置为包装长行,甚至包装所有行。 -
用于创建标签-字段对的便捷API。
使用QString和QWidget *的addRow() 重载在后台创建QLabel并自动设置其好友。 然后我们可以编写如下代码: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);
下表显示了不同样式的默认外观。
QCommonStyle QMacStyle QPlastiqueStyle Qt Extended styles Windows,GNOME和早期版本的KDE使用的传统样式。 标签保持左对齐,并且扩展字段会增长以填充可用空间。 基于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);
公共类型
Struct TakeRowResult
包含QFormLayout::takeRow()调用的结果。
公共变量
类型 | 变量 |
---|---|
QLayoutItem * | fieldItem |
QLayoutItem * | labelItem |
enum FieldGrowthPolicy
此枚举指定了可以用来控制表单字段增长方式的不同策略。
Constant | Value | Description |
---|---|---|
QFormLayout::FieldsStayAtSizeHint | 0 | 字段永远不会超出它们的有效大小提示。这是QMacStyle的默认设置。 |
QFormLayout::ExpandingFieldsGrow | 1 | 具有水平扩展或最小扩展大小策略的字段将增长以填充可用空间。其他字段的增长不会超过它们的有效大小提示。这是塑料炸弹的默认策略。 |
QFormLayout::AllNonFixedFieldsGrow | 2 | 所有具有允许扩展的大小策略的字段都将扩展以填充可用空间。这是大多数样式的默认策略。 |
enum ItemRole
此枚举指定可能出现在一行中的小部件(或其他布局项)的类型。
Constant | Value | Description |
---|---|---|
QFormLayout::LabelRole | 0 | 标签窗口小部件。 |
QFormLayout::FieldRole | 1 | 字段小部件。 |
QFormLayout::SpanningRole | 2 | 跨跃标签和字段列的小部件。 |
enum RowWrapPolicy
此枚举指定了可用于控制表单行换行方式的不同策略。
Constant | Value | Description |
---|---|---|
QFormLayout::DontWrapRows | 0 | 字段总是排列在它们的标签旁边。这是除Qt扩展样式外所有样式的默认策略。 |
QFormLayout::WrapLongRows | 1 | 标签有足够的水平空间来容纳最宽的标签,其余的空间留给字段。如果字段对的最小大小比可用空间宽,则该字段将被换行到下一行。这是Qt扩展样式的默认策略。 |
QFormLayout::WrapAllRows | 2 | 字段总是在它们的标签下面。 |
属性
-
fieldGrowthPolicy: FieldGrowthPolicy 字段的增长方式
默认值取决于小部件或应用程序样式。对于QMacStyle,默认值为FieldsStayAtSizeHint;对于QCommonStyle派生样式(如Plastique和Windows),默认值为ExpandingFieldsGrow;对于Qt扩展样式,默认值为AllNonFixedFieldsGrow。
如果没有任何字段可以增长,并且窗体的大小调整了,则会根据当前窗体对齐方式分配额外的空间。
- QFormLayout::FieldGrowthPolicy fieldGrowthPolicy() const
- void setFieldGrowthPolicy(QFormLayout::FieldGrowthPolicy policy)
-
formAlignment: Qt::Alignment 在布局的几何图形中保持窗体布局内容的对齐
默认值取决于小部件或应用程序样式。对于QMacStyle,默认值为Qt::AlignHCenter | Qt::AlignTop;对于其他样式,默认值为Qt::AlignLeft | Qt::AlignTop。- Qt::Alignment formAlignment() const
- void setFormAlignment(Qt::Alignment alignment)
-
horizontalSpacing: int 并排排列的小部件之间的间距
默认情况下,如果没有显式设置值,则布局的水平间距将从父布局或父小部件的样式设置继承。
- int horizontalSpacing() const
- void setHorizontalSpacing(int spacing)
-
verticalSpacing: int 垂直布局的小部件之间的间距
默认情况下,如果没有显式设置值,则布局的垂直间距将从父布局或父小部件的样式设置继承。
- int verticalSpacing() const
- void setVerticalSpacing(int spacing)
-
labelAlignment: Qt::Alignment 标签的水平对齐
默认值取决于小部件或应用程序样式。对于QCommonStyle派生的样式,除了QPlastiqueStyle之外,默认值是Qt::AlignLeft;对于其他样式,默认值是Qt::AlignRight。
- Qt::Alignment labelAlignment() const
- void setLabelAlignment(Qt::Alignment alignment)
-
rowWrapPolicy: RowWrapPolicy 窗体行的换行方式
默认值取决于小部件或应用程序样式。对于Qt扩展样式,默认值为WrapLongRows;对于其他样式,默认值为DontWrapRows。
如果要将每个标签显示在其关联字段的上方(而不是旁边),请将此属性设置为wrappallrows。
- QFormLayout::RowWrapPolicy rowWrapPolicy() const
- void setRowWrapPolicy(QFormLayout::RowWrapPolicy policy)
公共函数
构造和析构
- QFormLayout(QWidget *parent = nullptr)
- virtual ~QFormLayout()
属性相关
- QFormLayout::FieldGrowthPolicy fieldGrowthPolicy() const
- void setFieldGrowthPolicy(QFormLayout::FieldGrowthPolicy policy)
- Qt::Alignment formAlignment() const
- void setFormAlignment(Qt::Alignment alignment)
- int horizontalSpacing() const
- void setHorizontalSpacing(int spacing)
- Qt::Alignment labelAlignment() const
- void setLabelAlignment(Qt::Alignment alignment)
- QFormLayout::RowWrapPolicy rowWrapPolicy() const
- void setRowWrapPolicy(QFormLayout::RowWrapPolicy policy)
- int verticalSpacing() const
- void setVerticalSpacing(int spacing)
增删改查
- 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)
- void addRow(QWidget *widget)
- void addRow(QLayout *layout)
- 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)
- void insertRow(int row, QWidget *widget)
- void insertRow(int row, QLayout *layout)
- void removeRow(int row)
- void removeRow(QWidget *widget)
- void removeRow(QLayout *layout)
- QFormLayout::TakeRowResult takeRow(int row)
- QFormLayout::TakeRowResult takeRow(QWidget *widget)
- QFormLayout::TakeRowResult takeRow(QLayout *layout)
- QLayoutItem * itemAt(int row, QFormLayout::ItemRole role) const
- void setItem(int row, QFormLayout::ItemRole role, QLayoutItem *item)
- void setLayout(int row, QFormLayout::ItemRole role, QLayout *layout)
- void setWidget(int row, QFormLayout::ItemRole role, QWidget *widget)
- 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
其他
- QWidget * labelForField(QWidget *field) const
- QWidget * labelForField(QLayout *field) const
- int rowCount() const
- int spacing() const
- void setSpacing(int spacing)
重写的公共函数
- virtual void addItem(QLayoutItem *item) override
- virtual QLayoutItem * takeAt(int index) override
- virtual QLayoutItem * itemAt(int index) const override
- virtual int count() const override
- virtual void invalidate() override
- virtual Qt::Orientations expandingDirections() const override
- virtual bool hasHeightForWidth() const override
- virtual int heightForWidth(int width) const override
- virtual QSize minimumSize() const override
- virtual void setGeometry(const QRect &rect) override
- virtual QSize sizeHint() const override
演示代码
#include <QtWidgets>
#define Layout QFormLayout
int i,j,count;
QList <QLabel *> labels;
QList <Layout *> layouts;
void addFrame(QWidget *parent){
QGridLayout *mainLayout =static_cast<QGridLayout *>(parent->layout () ) ;
QFrame *frame = new QFrame();
frame->setFrameStyle (QFrame::Panel | QFrame::Plain);
QVBoxLayout *vBox = new QVBoxLayout(frame);
QLabel *label = new QLabel();
label->setMaximumHeight (30);
labels << label;
vBox->addWidget (label);
Layout *layout = new Layout;
layouts << layout;
vBox->addLayout (layout);
layout->addRow (new QLabel("标签0"),new QLineEdit("字段0"));
layout->addRow (new QLabel("标签1"),new QLineEdit("字段1"));
layout->addRow (new QLabel("标签2"),new QLineEdit("字段2"));
mainLayout->addWidget (frame,i,j);
++j,++count;
}
Layout* getLayout(int i){
if(i > count ){
qDebug() << i << __LINE__;
return 0;
}
return layouts.at (i);
}
void setLable(int i, QString text){
if(i > count ){
qDebug() <<"getLayout"<< i << __LINE__;
return;
}
labels.at (i)->setText (text);
}
int main(int argc, char *argv[])
{
QApplication::setStyle (QStyleFactory::create ("fusion"));
QApplication app(argc, argv);
QMetaObject mo = Layout::staticMetaObject;
app.setApplicationName (mo.className ());
QDialog dialog;
dialog.setWindowFlag (Qt::WindowContextHelpButtonHint,false);
auto *mainLayout = new QGridLayout;
dialog.setLayout (mainLayout);
addFrame(&dialog);
addFrame(&dialog);
getLayout (0)->setVerticalSpacing (10);
getLayout (1)->setVerticalSpacing (50);
setLable (0, "setVerticalSpacing (10)");
setLable (1, "setVerticalSpacing (50)");
dialog.show();
return app.exec();
}