QBoxLayout布局主要是控制控件在盒模型中的排列与尺寸,有如下规则:
一、控件的sizePolicy
- 控件sizePolicy的优先级最高,其次才会考虑布局的规则。
QSizePolicy
是Qt Widgets
模块下一个单独的类,没有父类也没有子类,只供其他类调用。QSizePolicy
有两个枚举,QSizePolicy::PolicyFlag
和QSizePolicy::Policy
,用于表示控件的sizePolicy。QSizePolicy::PolicyFlag
枚举如下:
Constant | Value | Description |
---|---|---|
QSizePolicy::GrowFlag | 1 | 如有必要,控件大小可以超过系统推荐的最大尺寸 |
QSizePolicy::ExpandFlag | 2 | 在父布局允许的范围内,控件要尽可能的大,获得尽可能多的空间 |
QSizePolicy::ShrinkFlag | 4 | 如有必要,控件大小可以小于系统推荐的最小尺寸 |
QSizePolicy::IgnoreFlag | 8 | 忽略系统推荐尺寸,控件获得尽可能多的空间 |
QSizePolicy::Policy
枚举如下:
Constant | Value | Description |
---|---|---|
QSizePolicy::Fixed | 0 | 将控件默认尺寸设置为 QWidget::sizeHint() 系统推荐尺寸,不可拉伸与缩放 |
QSizePolicy::Minimum (QSizePolicy::GrowFlag) | 1 | 控件最小尺寸设置为 QWidget::sizeHint() 系统推荐最小尺寸,最大尺寸不限制,可拉伸与缩放,但最小不能小于最小尺寸 |
QSizePolicy::Maximum (QSizePolicy::ShrinkFlag) | 4 | 控件最大尺寸设置为 QWidget::sizeHint() 系统推荐最大尺寸,最小尺寸不限制,可拉伸与缩放,但最大不能大于最大尺寸 |
QSizePolicy::Preferred (GrowFlag|ShrinkFlag) | 5 (1|4) | 将控件默认尺寸设置为 QWidget::sizeHint() 系统推荐尺寸,可拉伸与缩放,可以超过系统推荐的最大最小尺寸 |
QSizePolicy::MinimumExpanding (GrowFlag|ExpandFlag) | 3 (1|2) | 控件要获得尽可能多的空间,最小不能小于 QWidget::sizeHint() 系统推荐的最小尺寸,最大尺寸不限制,可拉伸与缩放 |
QSizePolicy::Expanding (GrowFlag|ExpandFlag|ShrinkFlag) | 7 (1|2|4) | 控件要获得尽可能多的空间,可以超过系统推荐的最大最小尺寸 |
QSizePolicy::Ignored (GrowFlag|ShrinkFlag|IgnoreFlag) | 13 (1|4|8) | 忽略系统推荐尺寸,控件获得尽可能多的空间 |
二、布局规则,控件尺寸
-
基本没有规则,主要以控件的sizePolicy为准。
-
如果布局中多个控件的sizePolicy不同,不同sizePolicy会产生空间竞争,他们的竞争等级如下,等级越高获取的空间越大:
MinimumExpanding
=Expanding
>Preferred
=Minimum
=Ignored
>Maximum
=Fixed
-
如下图:
- 布局
(A)
,由于Ignored
忽略了系统推荐尺寸(没有强大后台了,哈哈),所以比他等级高的都有绝对竞争力,结果就是等级为Ignored
的控件被挤没了,如下图。 - 布局
(B)
,由于Maximum
和Fixed
一个最大不超过系统推荐尺寸,一个最大尺寸被固定为系统推荐尺寸,所以两者都不去竞争多余空间,如下图。 - 布局
(C)
,PushButton1
和PushButton2
的Vertical Policy
设置为Minimum
,所以可以调整高度以填满布局,PushButton3
的Vertical Policy
为Fixed
,无法调整高度。 - 布局
(C)
,PushButton1
和PushButton2
的Horizontal Policy
设置为Minimum
,PushButton3
的Horizontal Policy
为Fixed
,所以PushButton3
的宽度为固定值,布局水平方向的剩余空间由PushButton1
和PushButton2
调整宽度来填充。
- 布局
三、布局规则,控件间距
- 规则一:控件sizePolicy的设置,如布局中有可以自由调整尺寸的控件,不设置控件间距,则默认控件间距为
6
,控件自动调整尺寸以填满布局盒模型。 - 规则二:控件sizePolicy的设置,如布局中没有可以自由调整尺寸的控件,则控件间距将被拉伸,以满足sizePolicy,但此时控件间距的值仍为默认值或所设置的值。
- 如下图:
- 布局
(A)
,PushButton1
和PushButton4
的Vertical Policy
设置为Fixed
,不能自由调整高度,但PushButton2
和PushButton3
的Vertical Policy
设置为Minimum
,可以自由调整高度,根据规则一,控件间距为默认值6
。 - 布局
(B)
,PushButton1
和PushButton3
的Horizontal Policy
都为Minimum
,PushButton2
的Horizontal Policy
都为Fixed
,根据规则一,控件间距为默认值6
。 - 布局
(C)
,PushButton1
和PushButton2
的Horizontal Policy
都为Fixed
,都不能自由调整宽度,根据规则二,控件间距被拉伸,但此时控件间距的值仍为默认值6
。
- 布局