第四章 Qt之布局管理
4.1 布局管理系统
4.1.1 布局管理器
所有QWidget的子类的实例(对象)都可以使用布局管理器管理位于它们之中的子部件,QWidget::setLayout()函数可以在一个部件上应用布局管理器完成以下任务:
- 定位子部件
- 感知窗口的默认大小
- 感知窗口的最小大小
- 窗口大小变化时进行处理
- 当内容改变时自动更新:
- 字体大小、文本或子部件的其他内容随之改变
- 隐藏或显示子部件
- 移除一个子部件
伸缩因子(stretch factor)用于设置部件间比例的。只有当布局管理器为顶级布局管理器时才有效。
layoutSizeConstraint属性用于约束窗口的大小,该值只对顶级布局管理器有效,对其子部件没有效果
| layoutSizeConstraint属性 | 描述 |
|---|---|
| Qlayout::SetDefaultConstraint | 主窗口大小设置位minimumSize()的值,除非该部件已经有一个最小大小 |
| Qlayout::SetFixedSize | 主窗口的大小设置为sizeHint()的值,它无法改变 |
| Qlayout::SetMinimumSize | 主窗口的大下设置为minimumSize()的值,它无法再缩小 |
| Qlayout::SetMaximumSize | 主窗口的大小设置为maximumSize()的值,它无法再放大(??任然可以放大) |
| Qlayout::SetMinAndMaxSize | 主窗口的大小设置为minimumSize()的值,最大大小设置为maximumSize()的值 |
| Qlayout::SetNoConstraint | 部件不受约束 |
4.1.1.1 基本布局管理器(QBoxLayout)
基本布局管理器QBoxLayout类可以使子部件在水平方向或垂直方向排成一列,它将所有的空间分成一行盒子,然后将每个部件放入一个盒子中。
- QHBoxLayout:水平布局管理器
- QVBoxLayout:垂直布局管理器

#incldue <QVBoxLayout>
QVBoxLayout *layout = new QVBoxLayout; //定义所使用的布局管理器
layout->addWidget(ui->fontComboBox); //为布局管理器添加部件
layout->addWidget(ui->textEdit); //为布局管理器添加部件
//layout->insertWidget(index,部件, 拉伸因子, 对其方式); //添加部件到准确的位置
layout->setSpacing(10); //设置布局间的间隔
layout->setContentsMargins(50,2,50,2); //设置布局管理器的四周空白边(左、上、右、下)
setLayout(layout); //使用设置的布局管理器
4.1.1.2 栅格布局管理器(QGridLayout)
栅格布局管理器(QGridLayout)类使部件在网格中进行布局,它将所有的空间分隔成一些行和列,行和列的交叉处形成了单元格,然后将部件放入一个确定的单元格中。
#include <QGridLayout>
QGridLayout *layout = new QGridLayout;
layout->addWidget(ui->fontComboBox, 0, 0, 1, 2); //从第0行第0列开始,占据1行2列
layout->addWidget(ui->textEdit,1,0,1,3); //从第0行第2列开始,占据1行1列
layout->addWidget(ui->pushButton,0, 2, 1, 1); //从第1行第0列开始,占据1行3列
setLayout(layout);
4.1.1.3 窗体布局管理器(QFormLayout)
窗体布局管理器(QFormLayout)类用于管理表单的输入部件一级与它们相关的标签。窗体布局管理器将其子部件分为两列,左边是标签,右边是输入部件。与栅格布局管理器不同的是该管理器对一行内的两个部件建立了(伙伴)buddy关系
#include <QFormLayout>
#include <QComboBox>
#include <QLineEdit>
#include <QSpinBox>
#include <QComboBox>
QFormLayout *formLayout = new QFormLayout;
QLineEdit *nameLineEdit = new QLineEdit(this);
QComboBox *xingbiecombox = new QComboBox(this);
QStringList xingbie;
xingbie << tr("男")<< tr("女");
xingbiecombox->addItems(xingbie);
QSpinBox *agebox = new QSpinBox(this);
QLineEdit *mailLineEdit = new QLineEdit(this);
formLayout->addRow(tr("姓名(&N)"), nameLineEdit);
formLayout ->addRow(tr("性别(&S)"), xingbiecombox);
formLayout->addRow(tr("年龄(&A)"), agebox);
formLayout->addRow(tr("邮箱(&M)"), mailLineEdit);
setLayout(formLayout);

4.1.2 设置部件大小
| 继承QWidget类拥有的两个属性 | 描述 |
|---|---|
| sizeHint 通过sizeHint()函数获取该值 | 保存部件的建议大小 |
| minimumSizeHint 通过minimumSizeHint()函数获取该值 | 保存部件建议的最小大小的提示 |
| setMinimumSize() | 设置部件为最小大小,同时忽略最小大小的提示 |
| sizePolicy | 保存了部件的默认布局行为,在水平和垂直方向上起作用 |
| sizePolicy属性参数 | 描述 |
|---|---|
| QSizePolicy::Fixed | 只能使用sizeHint()提供的值,无法伸缩 |
| QSizePolicy::Minimum | sizeHint()提供的大小是最小的,部件可以被拉伸 |
| QSizePolicy::Maximum | sizeHint()提供的是最大的大小,部件可以被压缩 |
| QSizePolicy::Preferred | sizeHint()提供的大小是最佳大小,部件可以被压缩或拉伸 |
| QSizePolicy::Expanding | sizeHint()提供的是合适的大小,部件可以被压缩,不过它更倾向于被拉伸来获得更多的空间 |
| QSizePolicy::MinimumExpanding | sizeHint()提供的大小是最小的,部件倾向于被拉伸来获取更多的空间 |
| QSizePolicy::Ignored | sizeHint()的值被忽略,部件将尽可能地被拉伸来获取更多的空间 |
4.1.3 可扩展窗口
一个窗口可能有很多选项时扩充的,只有在必要的时候才显示出来,这是就可以使用一个按钮来隐藏或者显示多余的内容,就是所谓的可扩展窗口。
eg:当子部件隐藏时,布局管理器自动缩小;当子部件显示时,布局管理器自动放大。
4.1.4 分裂器(QSplitter)
分裂器(QSplitter)类提供了一个分裂器部件,可以完成布局管理器的功能,但是包含在它里面的部件,默认是可以随着分裂器的大小变化而变化的。
4.2 设置伙伴(buddy)
QLabel的一种机制,提供了助记符来定位焦点到对应的部件上(此处的助记符即Alt+alpha),而该部件则被称为是QLabel的伙伴。
其中助记符即加速键,使用英文标签时,在字符串的一个字母前面加“&”符号,可以制定该标签的加速键。Qt的设计师界面可以通过下图的按钮进入伙伴关系设置模式;同时也可以通过QLabel的SetBuddy()函数完成代码实现。

4.3 设置Tab顺序(setTaborder)
对于一个应用程序,总是希望通过Tab键将焦点从一个部件移动到下一个部件,Qt的设计师界面可以通过下图的按钮进入Tab顺序设置模式,通过点击数字设置顺序,当程序运行时,焦点总是会在Tab键顺序为1的部件上。

也可通过MyWidget类的构造函数中使用如下代码进行设置:
void QWidget::setTabOrder(QWidget *first, QWidget *second);
4.4 Qt Creator中的定位器(search with the Locator)
定位器的作用:
- 打开制定文件
- 定位到文档的指定行
- 打开一个特定的帮助文档
- 进行项目函数的查找
定位器的使用:前缀符号+空格+要定位的内容
浙公网安备 33010602011771号