ZAARONBIN - 博客园

第四章 Qt之布局管理

4.1 布局管理系统

graph TD A(Qlayout)-->B(基本布局管理器 QBoxLayout) B-->b1(QHBoxLayout) B-->b2(QVBoxLayout) A-->C(窗体布局管理器 QFormLayout) A-->D(栅格布局管理器 QGridLayout) A--与第三章的QStackedWidget用法相同-->F(栈布局管理器 QStackedLayout)

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:垂直布局管理器

image-20210314162325986

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

image-20210314200519105

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()函数完成代码实现。

image-20210315091815329

4.3 设置Tab顺序(setTaborder)

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

image-20210315092322844

也可通过MyWidget类的构造函数中使用如下代码进行设置:

void QWidget::setTabOrder(QWidget *first, QWidget *second);

4.4 Qt Creator中的定位器(search with the Locator)

定位器的作用

  • 打开制定文件
  • 定位到文档的指定行
  • 打开一个特定的帮助文档
  • 进行项目函数的查找

定位器的使用:前缀符号+空格+要定位的内容

posted @ 2021-03-18 10:23  BINBINBINZ  阅读(440)  评论(0)    收藏  举报