布局类(07):【类】QFormLayout[官翻]

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);
    

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

    QCommonStyleQMacStyleQPlastiqueStyleQt Extended styles
    imgimgimgimg
    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

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

ConstantValueDescription
QFormLayout::FieldsStayAtSizeHint0字段永远不会超出它们的有效大小提示。这是QMacStyle的默认设置。
QFormLayout::ExpandingFieldsGrow1具有水平扩展或最小扩展大小策略的字段将增长以填充可用空间。其他字段的增长不会超过它们的有效大小提示。这是塑料炸弹的默认策略。
QFormLayout::AllNonFixedFieldsGrow2所有具有允许扩展的大小策略的字段都将扩展以填充可用空间。这是大多数样式的默认策略。

enum ItemRole

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

ConstantValueDescription
QFormLayout::LabelRole0标签窗口小部件。
QFormLayout::FieldRole1字段小部件。
QFormLayout::SpanningRole2跨跃标签和字段列的小部件。

enum RowWrapPolicy

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

ConstantValueDescription
QFormLayout::DontWrapRows0字段总是排列在它们的标签旁边。这是除Qt扩展样式外所有样式的默认策略。
QFormLayout::WrapLongRows1标签有足够的水平空间来容纳最宽的标签,其余的空间留给字段。如果字段对的最小大小比可用空间宽,则该字段将被换行到下一行。这是Qt扩展样式的默认策略。
QFormLayout::WrapAllRows2字段总是在它们的标签下面。

属性

  1. fieldGrowthPolicy: FieldGrowthPolicy 字段的增长方式

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

    如果没有任何字段可以增长,并且窗体的大小调整了,则会根据当前窗体对齐方式分配额外的空间。

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

  2. formAlignment: Qt::Alignment 在布局的几何图形中保持窗体布局内容的对齐
    默认值取决于小部件或应用程序样式。对于QMacStyle,默认值为Qt::AlignHCenter | Qt::AlignTop;对于其他样式,默认值为Qt::AlignLeft | Qt::AlignTop。

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

  3. horizontalSpacing: int 并排排列的小部件之间的间距

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

    • int horizontalSpacing() const
    • void setHorizontalSpacing(int spacing)

  4. verticalSpacing: int 垂直布局的小部件之间的间距

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

    • int verticalSpacing() const
    • void setVerticalSpacing(int spacing)

  5. labelAlignment: Qt::Alignment 标签的水平对齐

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

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

  6. 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();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值