1 Qt布局的作用

Qt的布局是通过布局管理器来实现的,布局管理器负责在父类窗口部件区域构建子窗口部件,使得放置在窗体中的每个窗口部件都有一个适合的大小和位置,并且能够随着应用程序本身的变化而变化从而达到不改变整体的布局的结构的效果。
相对于通过设定绝对位置来搭建界面的方法来讲有如下优点

  • 父窗口改变的时候,子窗口不能作出相应的调整。
  • 不用人工计算这些位置和大小

    2 Qt中的布局类及继承关系:

    继承关系图如下:

QBoxLayout:直线布局,可以规定排序的方向是从左到右还是从右到左,从上到下还是从下到上布局
QHBoxLayout :水平布局
QVBoxLayout :垂直布局
QGridLayout : 将空间划分为若干个行和列,并把子窗口部件放置到划分成的一个个小空间中
QFormLayout :表格布局把布局空间划分为两列,一列一般放标签,另一列一般用于放置LableEdit之类的窗口部件。
QStackedLayout:把一系列窗口部件排列成堆叠的形式,每次只能顶部的部件是可见的。

3 改善布局结构

大小暗示sizeHint在未被重载的情况下,如果该窗口部件属于某个布局管理器,那么返回的值为QT为这个部件推荐的尺寸。如果不属于任何布局管理器的时候返回无效的值
最小大小暗示minimumsizehint :为某个窗口部件提供最小大小的限制。任何小于这个尺寸的窗口都被限制为这个大小

QSizePolicy::Fixed 0 控件的大小固定为sizeHint的推荐大小,不能再改变;
QSizePolicy::Minimum GrowFlag 控件的大小最小为sizeHint的推荐大小,可以往大了拉伸,但最小不可小过sizeHint;
QSizePolicy::Maximum ShrinkFlag 控件的大小最大为sizeHint的推荐大小,可以往小了缩小,但最大不可大过sizeHint;
QSizePolicy::Preferred GrowFlag | ShrinkFlag sizeHint大小比较的合理,最小还是sizeHint,但是拉伸比较倾向于不超过sizeHint;
QSizePolicy::Expanding GrowFlag | ShrinkFlag | ExpandFlag 顾名思义就是扩大呗,最小不能小过sizeHint,拉伸就随意了;
QSizePolicy::MinimumExpanding GrowFlag | ExpandFlag 与Minimum差不多,最小为sizeHint,不能再小了,也可以拉伸。区别就是和同一方向的其他控件一块布局时会尽可能的占有空间,除非它们也是这个策略;
QSizePolicy::Ignored ShrinkFlag | GrowFlag | IgnoreFlag 控件的大小不再与sizeHint相关,可以尽情的拉伸,也可以缩小比sizeHint建议的小,毕竟忽略了;

大小策略 QSizePolicy
Fix 不会发生任何的伸缩
minimum 推荐的大小是它的最小尺寸,它不会变得更小,但是可以变得更大
maximum 推荐的大小是它的最大尺寸,不会变得更大
preferred 推荐大小为优先选择,可以变大或者变小
expanding 能够感知到推荐的大小,但是会以尽可能大的空间来放置窗口部件
ignore 不能感知到推荐的大小,会以尽可能大的空间来放置窗口部件
伸缩因子
用于说明在增大窗体的时候,对不同的子窗口部件使用不同的放大比例。通过设置qsizePolicy::horizontalstretch qsizePolicy::verticalstretch来实现
大小限制
设置窗口的最大大小最小大小,通过sizeConstraint来获取,通过setsizeconstraint来设置
空白和边距
空白指的是整个布局四周距离窗体边缘的距离,间距指的是布局内部各个窗口部件之间的距离
空白设置setcontentmargins,间距设置setspacing
对于栅格布局和表格布局使用的是sethorizonspacing和setverticalspacing来设置。

4 布局管理器的基本操作

向布局中增加部件
向布局中删除部件
取消布局
应用一个布局