前言
QSizePolicy是一个在QT开发中并不常见,但又十分重要的东西。它负责控制控件的伸缩属性,我们可以通过使用不同的值而达到各种UI布局。
之所以说并不常见,原因是我们更多的在UI界面中直接设置它的属性sizePolicy或者sizeType,而并不直接用代码书写。
且对于平时绝大多数开发工作来说,我们只需要用到它的三个值便可以解决大部分问题:Fixed、Preferred、Expanding。所以并不需要了解它的具体实现方式和其他类型,但实际上它还可以做的更多。
正文
一、QSizePolicy的定义
- 关于QSizePolicy的定义,官方给出的文档中是这么说的
The QSizePolicy class is a layout attribute describing horizontal and vertical resizing policy.
直译过来大致是说:QSizePolicy类是描述水平和垂直调整大小策略的布局属性。
二、sizePolicy的类型
- QT为我们提供了7种Policy,其源码的定义如下:
enum Policy {
Fixed = 0,
Minimum = GrowFlag,
Maximum = ShrinkFlag,
Preferred = GrowFlag | ShrinkFlag,
MinimumExpanding = GrowFlag | ExpandFlag,
Expanding = GrowFlag | ShrinkFlag | ExpandFlag,
Ignored = ShrinkFlag | GrowFlag | IgnoreFlag
};
- Flag的定义如下
enum PolicyFlag {
GrowFlag = 1,
ExpandFlag = 2,
ShrinkFlag = 4,
IgnoreFlag = 8
};
可以看到,实际的sizePolicy是由PolicyFlag 组合而成的。这也更符合控件设计的思路,提出各个sizePolicy的公共属性,方便理解和维护。
之后我将QT给出的解释放在下面,英文是QT官方文档,翻译是百度+笔者自行总结得到的。读者可以先行领略,或者直接跳到后文,笔者将会用UI实例让读者更加容易的理解QSizePolicy。
Constant | Value | Description | Translation |
---|---|---|---|
QSizePolicy::GrowFlag | 1 | The widget can grow beyond its size hint if necessary. | 如果有必要,widget可以扩展到超过其默认大小 |
QSizePolicy::ExpandFlag | 2 | The widget should get as much space as possible. | widget应尽可能的占据更多空间 |
QSizePolicy::ShrinkFlag | 4 | The widget can shrink below its size hint if necessary. | 如果有必要,widget可以s收缩到小于其默认大小 |
QSizePolicy::IgnoreFlag | 8 | The widget’s size hint is ignored. The widget will get as much space as possible. | widget默认大小会被忽略,且它会尽可能的占据更多空间 |
Constant | Value | Description | Translation |
---|---|---|---|
QSizePolicy::Fixed | 0 | The QWidget::sizeHint() is the only acceptable alternative, so the widget can never grow or shrink (e.g. the vertical direction of a push button). | QWidget永远不会增长或收缩 |
QSizePolicy::Minimum | GrowFlag | The sizeHint() is minimal, and sufficient. The widget can be expanded, but there is no advantage to it being larger (e.g. the horizontal direction of a push button). It cannot be smaller than the size provided by sizeHint(). | 限定了QWidget的最小尺寸为sizeHint(),且有被动扩展的趋势。 |
QSizePolicy::Maximum | ShrinkFlag | The sizeHint() is a maximum. The widget can be shrunk any amount without detriment if other widgets need the space (e.g. a separator line). It cannot be larger than the size provided by sizeHint(). | 限定了QWidget的最大尺寸为sizeHint(),且有被动收缩的趋势。 |
QSizePolicy::Preferred | GrowFlag \ ShrinkFlag | The sizeHint() is best, but the widget can be shrunk and still be useful. The widget can be expanded, but there is no advantage to it being larger than sizeHint() (the default QWidget policy). | sizeHint()是最好的大小,但必要时也可缩小或扩大尺寸 |
QSizePolicy::Expanding | GrowFlag \ ShrinkFlag \ ExpandFlag | The sizeHint() is a sensible size, but the widget can be shrunk and still be useful. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a horizontal slider). | sizeHint()是一个合理的大小,但QWidget趋向于获取更多空间,必要时也会收缩自身大小 |
QSizePolicy::MinimumExpanding | GrowFlag \ ExpandFlag | The sizeHint() is minimal, and sufficient. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a horizontal slider). | 限定了QWidget的最小尺寸为sizeHint(),但QWidget趋向于获取更多空间。 |
QSizePolicy::Ignored | ShrinkFlag \ GrowFlag \ IgnoreFlag | The sizeHint() is ignored. The widget will get as much space as possible. | QWidget的sizeHint()会被忽略,且它会尽可能的占据更多空间 |
注:sizeHint()为QWidget的建议大小,如果用户指定的值无效或者其没有被布局,则会返回无效值。
可以得出以下结论:
主动获取空间能力:Expanding = MinimumExpanding >> Preferred = Minimum = Ignored >> Fixed = Maximum 这也对应了PolicyFlag 中ExpandFlag 与 GrowFlag兼具扩张能力,而ExpandFlag 扩张能力更佳。
保持自身空间能力:Minimum = MinimumExpanding >> Fixed >> Maximum >> Preferred = Expanding >> Ignored