70常用控件_QVBoxLayout的使用
目录
代码⽰例: 使⽤ QVBoxLayout 管理多个控件.
代码⽰例: 创建两个 QVBoxLayout
布局管理器
之前使用Qt在界面上创建的控件,都是通过"绝对定位"的方式来设定的.
也就是每个控件所在的位置,都需要计算坐标,最终通过setGeometry或者move方式摆放过去.
这种设定方式其实并不方便,尤其是界面如果内容比较多,不好计算,而且一个窗口大小往往是可以调整
的,按照绝对定位的方式,也无法自适应窗口大小.
因此Qt引入"布局管理器"(Layout)机制,来解决上述问题,
也就是每个控件所在的位置,都需要计算坐标,最终通过setGeometry或者move方式摆放过去.
这种设定方式其实并不方便,尤其是界面如果内容比较多,不好计算,而且一个窗口大小往往是可以调整
的,按照绝对定位的方式,也无法自适应窗口大小.
因此Qt引入"布局管理器"(Layout)机制,来解决上述问题,
当然, 布局管理器并⾮ Qt 独有. 其他的 GUI 开发框架, 像 Android, 前端等也有类似的机制
垂直布局
使⽤ QVBoxLayout 表⽰垂直的布局管理器. V 是 vertical 的缩写.
核⼼属性
属性 | 说明 |
---|---|
layoutLeftMargin | 左侧边距 |
layoutRightMargin | 右侧边距 |
layoutTopMargin | 上方边距 |
layoutBottomMargin | 下方边距 |
layoutSpacing | 相邻元素之间的间距 |
Layout 只是⽤于界⾯布局, 并没有提供信号.
代码⽰例: 使⽤ QVBoxLayout 管理多个控件.
1) 编写代码, 创建布局管理器和三个按钮. 并且把按钮添加到布局管理器中.
• 使⽤ addWidget 把控件添加到布局管理器中.
• 使⽤ setLayout 设置该布局管理器到 widget 中.

2) 运⾏程序, 可以看到此时界⾯上的按钮就存在于布局管理器中. 随着窗⼝尺⼨变化⽽发⽣改变.
此时三个按钮的尺⼨和位置, 都是⾃动计算出来的
通过上述代码的⽅式, 只能给这个 widget 设定⼀个布局管理器. 实际上也可以通过 Qt Design 在⼀个窗 ⼝中创建多个布局管理器.
代码⽰例: 创建两个 QVBoxLayout
1) 在界⾯上创建两个 QVBoxLayout , 每个 QVBoxLayout 各放三个按钮.

2) 运⾏程序, 可以看到这些按钮已经⾃动排列好. 只不过当前这些按钮的位置不能随着窗⼝⼤⼩⾃动变化
通过 Qt Designer 创建的布局管理器, 其实是先创建了⼀个 widget, 设置过 geometry 属性的. 再把这个 layout 设置到这个 widget 中.实际上, ⼀个 widget 只能包含⼀个 layout.打开 ui ⽂件的原始 xml, 可以看到其中的端倪.这种情况下 layout 并⾮是窗⼝ widget 的布局管理器, 因此不会随着窗⼝⼤⼩改变
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QVBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建三个按钮, 使用垂直布局管理器管理起来QPushButton* button1 = new QPushButton("按钮1");QPushButton* button2 = new QPushButton("按钮2");QPushButton* button3 = new QPushButton("按钮3");// 创建布局管理器QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);// 把布局管理器添加到窗口中.this->setLayout(layout);}Widget::~Widget()
{delete ui;
}
之前把控件放到界面上,都是靠“手动”的方式来布局的~~
这种手动调整的方式是不科学的!!
1.手动布局的方式非常复杂,而且不精确.
2.无法对窗口大小进行自适应~~
布局管理器~~
Qt中提供了很多种布局管理器~~
1.垂直布局~~
2.水平布局~
3. 网格布局
4. 表单布局
每个widget中只能设置一个布局管理器.
如果在代码中创建layout,其实是只创建了一个layout.
如果在QtDesigner中创建的layout,先创建了一个Widget,然后再在这个新的Widget中添加了一个layout.
layout标签表示的是布局管理器的本体.
外面自动创建出了一个Widget
每个layout里面又可以包含若干个item(也就是一个按钮)
刚才是先拖了layout过去,然后再往layout中拖其他控件.
也可以先拖其他控件,后给这些控件套上layout~~
把选中的若干控件外头套上一个垂直布局的layout