Qt学习之路15--布局管理器(QFormLayout)

前面两节学习了布局管理器中的QBoxLayout和QGridLayout。
今天学习Qt中的第三种布局管理器–QFormLayout
在正式介绍之前抛出一个问题,怎样设计下面这个GUI界面?
这里写图片描述
根据之前学习过的内容来看有以下三种方式:
- 绝对定位,左边摆放QLabel,右边放QLineEdit。
- 嵌套使用QBoxLayout,在QVBoxLayout中嵌套使用QHBoxLayout,每个QHBoxLayout中管理一个QLabel和一个QLineEdit。
- 使用QGridLayout,创建一个三行两列的网格布局管理器,第一列放QLabel,第二列放QLineEdit。
其效果图如下:
这里写图片描述

通过上述方案是可以实现上面那个界面的,但是都是存在缺陷的,首先绝对定位的缺陷在刚学习布局管理器之前作为引子就已经说过,它不能根据窗口的扩展而自适应;其次使用QBoxLayout和QGridLayout,它俩的缺陷差不多,就是在属性设置时需要指定拉伸系数,这就导致随着拉伸可能出现这种情况:
这里写图片描述
当过分的拉伸之后整个界面看起来就非常难看了,除了难看,在代码实现上也是不够简洁的。

QFormLayout

所以,既为了好看也为了代码简洁,需要学习一种新的能对表单类型的界面进行布局的布局管理器了。
QFormLayout是以表单的形式管理界面组件,其中表单中的标签和组件相对应的关系。
这里写图片描述
通过代码简单了解一下QFormLayout的使用方式:

QFormLayout* layout = new QFormLayout();

QLineEdit* text1 = new QLineEdit();
QLineEdit* text2 = new QLineEdit();
QLineEdit* text3 = new QLineEdit();

layout->addRow("Name:",text1);//
layout->addRow("Email:",text2);
layout->addRow("Adress:",text3);
layout->setSpacing(10);

//layout->setRowWrapPolicy(QFormLayout::WrapLongRows);//该参数通常适用于小屏幕中,当标签和文本框在本行显示不全时,文本框会显示在下一行,使得标签独占一行
layout->setLabelAlignment(Qt::AlignLeft);//设置标签的对齐方式
setLayout(layout);
this->setWindowTitle("FTP");

这里写图片描述

AddRow()添加表单项

这里写图片描述

setRowWrapPolicy(RowWrapPolicy policy)函数的参数有三个可选项:
  • QFormLayout::DontWrapRows:该参数的含义是文本框总是出现在标签的后面,其中标签被赋予足够的水平空间以适应表单中出现的最宽的标签,其余的空间被赋予文本框。
  • QFormLayout::WrapLongRows:该参数通常适用于小屏幕中,当标签和文本框在屏幕的当前行显示不全时,文本框会显示在下一行,使得标签独占一行。
  • QFormLayout::WrapAllRows:该参数表示标签总是在文本框的上一行。
    分别对应的结果如下:
    这里写图片描述
    这里写图片描述
    这里写图片描述

QFormLayout布局管理器嵌套

根据AddRow函数的参数来看我们在添加表单项除了可以添加Widget组件以外还可以添加其他的布局管理器。

QFormLayout* layout = new QFormLayout();//顶级布局管理器
QVBoxLayout* vlayout = new QVBoxLayout();//被嵌套使用的布局管理器

QLineEdit* text1 = new QLineEdit();
QLineEdit* text2 = new QLineEdit();
QLineEdit* text3 = new QLineEdit();

vlayout->addWidget(text2);//子管理器布局
vlayout->addWidget(text3);

layout->addRow("Name:",text1);//往QFormLayout中添加表项
layout->addRow("Tel:",vlayout);
layout->setSpacing(10);

setLayout(layout);//设置顶级布局管理器
this->setWindowTitle("FTP");

输出结果为:
这里写图片描述

小结

  • QFormLayout以表单的形式进行管理界面组件
  • 通过使用QFormLayout可以发现其设置比较简洁明了
  • QFormLayout和QBoxLayout以及QGridLayout一样都支持布局管理器的嵌套使用
  • 19
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: QFormLayout布局可以通过设置控件的最小尺寸和最大尺寸来控制控件的大小。可以使用setFieldMinimumHeight()和setFieldMaximumHeight()方法来设置控件的最小和最大高度,使用setFieldMinimumWidth()和setFieldMaximumWidth()方法来设置控件的最小和最大宽度。此外,还可以使用setRowWrapPolicy()方法来设置行的换行策略,以便在窗口大小改变时自动调整控件的大小和位置。 ### 回答2: QFormLayoutQt 中的一种表单布局,其主要用途是创建数据输入和输出表单。其最大的特点就是能够让表格的各个行之间保持统一的宽度,排版更加美观。对于 QFormLayout 布局设置大小这一问题,需要分情况进行讨论: 1. 设置整个表格的大小 若希望设置整个表格的大小,可以通过设置布局的父视图的大小(如 QWidget、QDialog 等),来控制表格的大小。首先,需要调用父控件对象的 setSizePolicy 函数,将其设置为 QSizePolicy::Fixed,表示控件的大小不会随着父控件大小的改变而改变。接着,再设置父控件对象的固定大小,这样就可以控制 QFormLayout 的大小了。 2. 设置各个表单元素的大小 若需要控制各个表单元素的大小,可以对每个元素使用 setFixedSize 函数进行设置,来保证元素的大小不会随着表格的改变而改变。例如,对于 QLineEdit 这个表单元素,可以使用它的 setFixedSize 函数设置宽度和高度,来控制其大小。 3. 设置同一行的表单元素的比例 QFormLayout 提供了 setFieldGrowthPolicy 函数,可以设置同一行内的表单元素的比例,具有比例较大的元素将比比例小的元素更大。这个函数接受一个 QFormLayout::FieldGrowthPolicy 参数,可以是 QFormLayout::ExpandingFieldsGrow(扩展比例大的元素)或 QFormLayout::AllNonFixedFieldsGrow(扩展所有非固定元素)。 综上所述,使用 QFormLayout 布局设置大小需要根据具体情况进行设置,可以通过设置整个表格的大小、各个表单元素的大小、同一行的表单元素的比例等方式进行。 ### 回答3: QFormLayoutQt的一个布局管理器,它的作用是按照一定的规则来排列并设置控件和标签的位置以及它们的大小。QFormLayout的主要作用是实现表单的布局,例如设置表单中的标签和控件的排列方式,根据需求设置标签和控件的大小等。 QFormLayout的设置大小主要涉及两种控件:标签和控件。对于标签,可以通过setItem()方法来调整标签的大小。对于控件,因为控件大小一般由其本身来控制,所以QFormLayout中的控件大小一般不需要自己来设置,除非需要通过QSizePolicy来设置控件的大小策略。 在QFormLayout中设置控件和标签的大小时,需要注意以下几点: 1. 标签和控件的大小应该足够容纳相应的内容,不要挤压或者截断文本或者图片。 2. 如果标签和控件等大小,可以使用addRow()方法来添加,并将QFormLayout::FieldRole角色设为控件,QFormLayout::LabelRole角色设为标签。 3. 如果控件大小不确定,可以使用QSizePolicy来设置控件大小策略。 4. 可以通过setSpacing()方法来设置行间距和列间距。 总之,QFormLayout可以很方便地实现表单的布局,让表单中的各种控件和标签得到合理的排列和大小,从而提高表单的美观性和使用体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值