Qt Creator 快速入门 第4章 布局管理
类图
QWidget::setLayout()函数可以在一个部件上应用布局管理器。
任务:定位子部件;感知窗口默认大小;感知窗口最小大小;窗口大小变化时进行处理;当内容改变时自动更新;字体大小、文本或子部件的其他内容随之改变;隐藏或显示子部件;移除一个子部件;
QLayout和QLayoutItem都是在设计自己的布局管理器时才使用的,它们的子类:
QBoxLayout(基本布局管理器)、QGridLayout(栅格布局管理器)、QFormLayout(窗体布局管理器)、QStackeddLayout(栈布局管理器)与QStackedWidget用法相同。
在设计模式单击主界面,并按下Ctrl+L对主界面进行垂直布局管理。
1.设置部件大小
最适合大小提示(sizeHint)和最小大小提示(minimumSizeHint)是Qt内部提供的,且不会改变,凡是QWidget都有这两个属性。重要:如果使用setMinimumSize()函数设置了部件的最小大小(在设计模式中修改产生同样的效果),那么最小大小提示(minimumSizeHint)将会被忽略。
部件的大小策略(sizePolicy)属性,是QWidget类的属性,保存了部件的默认布局行为,在水平和垂直两个方向分别起作用,控制着部件在布局管理器中的大小变化行为。
部件的大小策略(sizePolicy)属性的不同选择,暗示着部件sizeHint()代表着不同的含义。
QSizePolicy::Fixed:当部件在布局管理器中(非顶层窗口布局管理器),以宽度为例,
如果minimumSize()的宽度大于sizeHint()的宽度,部件的宽度将等于minimumSize()的宽度,无法拉伸和收缩。部件宽度的取值范围:width = minimumSize()。
如果minimumSize()的宽度小于sizeHint()的宽度,部件的宽度将等于sizeHint()的宽度,无法拉伸和收缩。
部件宽度的取值范围:width = sizeHint()。
如果minimumSize()的宽度为默认0时,部件的宽度将等于sizeHint()的宽度,无法拉伸和收缩。
部件宽度的取值范围:width = sizeHint()。
QSizePolicy::Minimum:当部件在布局管理器中(非顶层窗口布局管理器),以宽度为例。
如果minimumSize()的宽度大于sizeHint()的宽度,可拉伸,但只能缩小到minimumSize()的尺寸,不能再缩小。部件宽度的取值范围: width >= minimumSize()。
如果minimumSize()的宽度小于sizeHint()的宽度,可拉伸,但只能缩小到sizeHint()的尺寸,不能再缩小。
部件宽度的取值范围:width>=sizeHint()。
如果minimumSize()的宽度为默认0时,可拉伸,但只能缩小到sizeHint()的尺寸,不能再缩小。
部件宽度的取值范围:width>=sizeHint()。
QSizePolicy::Maximum:当部件在布局管理器中(非顶层窗口布局管理器),以宽度为例。
如果minimumSize()的宽度为默认0时,部件能拉伸的最大值为sizeHint(),部件能压缩的最小值为minimumSizeHint()。部件宽度的取值范围:minimumSizeHint()<= width <= sizeHint()。
如果minimumSize()的宽度小于sizeHint()的宽度,部件能拉伸的最大值为sizeHint(),部件能压缩的最小值为
minimumSize()。部件宽度的取值范围:minimumSize()<= width <= sizeHint()。
如果minimumSize()的宽度大于sizeHint()的宽度,部件不能拉伸和收缩。部件宽度的取值范围:width = minimumSize()。
QSizePolicy::Preferred:当部件在布局管理器中(非顶层窗口布局管理器),以宽度为例。
如果minimumSize()的宽度为默认0时,部件能拉伸到无限大,部件能压缩的最小值为minimumSizeHint()。部件宽度的取值范围:minimumSizeHint()<= width
如果minimumSize()的宽度小于sizeHint()的宽度,部件能拉伸到无限大,部件能压缩的最小值为
minimumSize()。部件宽度的取值范围: minimumSize()<= width。
如果minimumSize()的宽度大于sizeHint()的宽度,部件能拉伸至无限大,部件压缩的最小值为minimumSize()。部件宽度的取值范围:minimumSize()<= width。
QSizePolicy::Expanding:合适大小,与Preferred相似。当部件在布局管理器中(非顶层窗口布局管理器),以宽度为例。
如果minimumSize()的宽度为默认0时,部件能拉伸到无限大,部件能压缩的最小值为minimumSizeHint()。部件宽度的取值范围:minimumSizeHint()<= width
如果minimumSize()的宽度小于sizeHint()的宽度,部件能拉伸到无限大,部件能压缩的最小值为
minimumSize()。部件宽度的取值范围: minimumSize()<= width。
如果minimumSize()的宽度大于sizeHint()的宽度,部件能拉伸至无限大,部件压缩的最小值为minimumSize()。部件宽度的取值范围:minimumSize()<= width。
QSizePolicy::MinimumExpanding:当部件在布局管理器中(非顶层窗口布局管理器),以宽度为例。
如果minimumSize()的宽度为默认0时,部件能拉伸到无限大,部件能压缩的最小值为minimumSizeHint()。部件宽度的取值范围:minimumSizeHint()<= width
如果minimumSize()的宽度小于sizeHint()的宽度,部件能拉伸到无限大,部件能压缩的最小值为
minimumSize()。部件宽度的取值范围: minimumSize()<= width。
如果minimumSize()的宽度大于sizeHint()的宽度,部件能拉伸至无限大,部件压缩的最小值为minimumSize()。部件宽度的取值范围:minimumSize()<= width。
1.基本布局管理器(QBoxLayout)
QHBoxLayout水平布局管理器、QVBoxLayout垂直布局管理器
代码修改上述属性:
layout->setSpacing(50); //设置部件间的间隔
layout->setContentsMargins(0,0,50,100); //设置布局管理器到边界的距离
layoutStrectch:当布局内包含多个子组件时,布局的大小发生变化时,子组件按何种比例变化占用全部空间。如果要在代码中进行设置,则可以使用布局管理器的addWidget()函数添加部件的同时,在第二个参数中指定伸缩因子。
layoutSizeConstraint:(这个只对顶级布局管理器有用,因为它只对窗口有用,对其他子部件没有效果)这话句话没测试出来。测试发现主窗口部件的布局这个属性如果不设成默认值,则该布局内的所有子部件的QSizePolicy全部被修改为与主窗口布局的这个属性相同。给人的感觉是集中修改子部件的QSizePolicy属性。
2.栅格布局管理器(QGridLayout)
使部件在网格中进行布局,它将所有的空间分隔成一些行和列。
QGridLayout * layout = new QGridLayout;
//添加部件,从第0行0列开始,占据1行2列
layout->addWidget(ui->fontComboBox,0,0,1,2);
当部件加入到一个布局管理器中,然后将这个布局管理器再放到一个窗口部件上时,这个布局管理器以及它包含的所有部件都会自动重新定义自己的父对象为这个窗口部件。
3.窗体布局管理器(QFormLayout)
用来管理表单的输入部件以及与它们相关的标签。窗体管理器也可以像普通管理器一样使用,但是,如果不是为了设计这样的表单,一般会使用栅格布局管理器。
4.综合使用布局管理器
如要使用代码来实现将一个子布局管理器放入一个父布局管理器之中,则可以使用父布局管理器的addLayout()函数。
5.窗体布局管理器相关属性说明
AllNonFixedFieldsGrow:布局的子部件本身能被拉伸的,全部被拉伸到最大,以适应窗体大小。子部件本身不能被拉伸的,不会被拉伸。
FieldsStayAtSizeHit:所有部件全部使用部件本身的sizeHit(),不会被拉伸或压缩。
ExpandingFieldsGrow:如表格所述。
4.1.3 可扩展窗口
要实现可扩展窗口,就要得力于布局管理器的特性,那就是当子部件隐藏时,布局管理器自动缩小,当子部件重新显示时,布局管理器再次放大。
4.1.4 分裂器(QSplitter)
包含在它里面的部件,默认是可以随着分裂器的大小变化而变人的。
4.2 设置伙伴(buddy)
伙伴是在QLabel类中提出的一个概念。如果要在代码中设置伙伴关系,则要使用QLabel的setBuddy()函数。
4.3 设置Tab键顺序
Tab键将焦点从一个部件移动到下一个部件。设计器提供了Tab键的设置功能。代码中设置
setTabOrder(ui->lineEdit,ui->spinBox);