- 如果有控件的伸展因子设置为 0,那么这个控件会尽量不占用窗口变大后的空闲区域,如果其他控件都不想要空闲区域,伸展因子为 0 的控件才会去尝试占据窗口变大后的空闲区域。默认情况下,所有控件的伸展因子其实都是 0,这时候布局器会优先拉伸尺寸策略为 QSizePolicy::Expanding 的控件。
- 比较例外的是表单布局器,表单布局器在垂直方向不拉伸,第一列的标签也不拉伸,受尺寸调整策略影响的只 有第二列的域在水平方向的拉伸行为。
- 伸展策略的枚举常量由 QSizePolicy::Policy 类型枚举,有七个定义好的常量,用于设置控件的水平和垂直伸展策略:
枚举常量 数值 拉伸特点 描述 QSizePolicy::Fixed 0 固定 以建议尺寸固定住,对于水平方向是固定宽度,垂直方向是固定高度。 QSizePolicy::Minimum GrowFlag 被动拉大 以建议尺寸为最小尺寸,如果有多余的空间就拉伸,没有多余的空间就保持建议尺寸。被动扩张。 QSizePolicy::Maximum ShrinkFlag 被动缩小 以建议尺寸为最大尺寸,窗口缩小时,如果其他控件需要,该控件可以尽量缩小为其他控件腾出空间。 QSizePolicy::Preferred GrowFlag |
ShrinkFlag被动伸缩 以建议尺寸为最佳尺寸,能屈能伸,窗口缩小时可以为其他控件腾出空间,窗口变大时,也可以占据其他控件不需要的空闲空间。基类 QWidget 默认是这种策略。被动扩张。 QSizePolicy::Expanding GrowFlag |
ShrinkFlag |
ExpandFlag主动扩张 建议尺寸仅仅是明智的建议,但控件基本不采用。这个模式也是能屈能伸,但它倾向于主动扩张,它会尽可能占据新增的区域。 QSizePolicy::MinimumExpanding GrowFlag |
ExpandFlag主动扩张 以建议尺寸作为最小尺寸,主动扩张,尽可能占据新增的区域。 QSizePolicy::Ignored ShrinkFlag |
GrowFlag |
IgnoreFlag野蛮扩张 忽略建议尺寸,虽然能屈能伸,但是它会尽最大可能占据空间。 - 我们对七个策略常量大致分两类,第一类是固定、单向缩小、单向拉大的,相同布局情景中,占据的尺寸大小排序为:
QSizePolicy::Maximum ≤ QSizePolicy::Fixed ≤ QSizePolicy::Minimum ≤ QSizePolicy::MinimumExpanding 。
-
第二类是能屈能伸的,如果在相同布局情景中,占据尺寸大小排序为:
QSizePolicy::Preferred ≤ QSizePolicy::Expanding ≤ QSizePolicy::Ignored 。
- 程序运行时,控件都可以通过函数 hide() 隐藏自己。在控件隐藏时,控件是否还占据布局器里的空间,这是可以设置的:
void QSizePolicy::setRetainSizeWhenHidden(bool retainSize) //设置控件在隐藏时是否仍占据布局器空间
bool QSizePolicy::retainSizeWhenHidden() const //判断隐藏控件是否占据布局器空间
默认情况下,控件调用 hide() 隐藏之后,就不会在通过布局器分配空间了,因为没有必要。 如果遇到特殊情况需要保留隐藏控件在布局器里的占用的空间,可以用上述函数设置。 如果设置保留隐藏控件的空间,那么布局器会留下一块空白区域,就是控件在隐藏前应该占据的区域。 - 注意,"Fixed" 按钮和 "Minimum" 按钮的尺寸下限是建议尺寸 sizeHint(),
而 "Preferred" 和 "Expanding" 按钮尺寸下限是最小建议尺寸 minimumSizeHint()。