目录
- QSizePolicy类详述
- 成员类型文档
QSizePolicy类详述
小部件的尺寸策略是其愿意以各种方式调整大小的表达方式,并影响布局引擎对小部件的处理方式。每个小部件返回一个描述其在布局时首选的水平和垂直调整策略的QSizePolicy
。您可以通过更改其QWidget::sizePolicy
属性来更改特定小部件的尺寸策略。
QSizePolicy
包含两个独立的QSizePolicy::Policy
值和两个拉伸因子;一个描述小部件的水平尺寸策略,另一个描述其垂直尺寸策略。它还包含一个标志,指示其首选尺寸的高度和宽度是否相关。
水平和垂直策略可以在构造函数中设置,并使用setHorizontalPolicy()
和setVerticalPolicy()
函数进行修改。可以使用setHorizontalStretch()
和setVerticalStretch()
函数设置拉伸因子。使用setHeightForWidth()
函数可以设置一个标志,指示小部件的sizeHint()
是否依赖于宽度(例如菜单栏或自动换行标签)。
可以使用horizontalPolicy()
、verticalPolicy()
、horizontalStretch()
和verticalStretch()
函数检索当前的尺寸策略和拉伸因子。或者,使用transpose()
函数交换水平和垂直策略和拉伸因子。hasHeightForWidth()
函数返回指示size hint依赖关系的标志的当前状态。
使用expandingDirections()
函数确定关联小部件是否可以利用比其sizeHint()
函数指示的更多空间,以及可以扩展的方向。
最后,QSizePolicy
类提供了将此尺寸策略与给定策略进行比较的运算符,以及将此QSizePolicy
存储为QVariant
对象的QVariant
运算符。
关于伸展因子:
如下图,如果把 “One” 按钮的 “水平伸展” 设为 1,“Two” 按钮的 “水平伸展” 设为 2,“Three” 按钮的 “水平伸展” 设为 3,那么在窗口拉大时,该行三个按钮的伸展因子之和为 1+2+3 == 6,新的空间就按照 1/6 ,2/6 ,3/6 的比例划分给这三个按钮,显示效果就如下面这样:
成员类型文档
关于sizeHint()
:
virtual QSize sizeHint() const
所有的控件初始时,布局器根据控件自己的QWidget::sizePolicy()
和 QWidget::sizeHint()
,分配相应的空间给各个控件。
此属性包含小部件的建议尺寸。这个建议尺寸是 Qt 类库自己根据需要显示的内容计算的。所有的控件和窗体都能自己计算建议尺寸。
如果此属性的值是无效的尺寸,则不建议使用任何尺寸。
如果此小部件没有布局,则sizeHint()
的默认实现返回无效的尺寸,否则返回布局的首选尺寸。
布局器中影响控件拉伸的因素:
① 最小尺寸和最大尺寸,控件尺寸会限定在最小尺寸和最大尺寸之间。
② 建议尺寸QWidget::sizeHint()
,这个建议尺寸是后续尺寸调整的基础,在布局时会先给控件分配建议尺寸的空间。
③ 伸展因子(stretch factors
),根据伸展因子的比例分配新增的空闲空间给各个控件。
④ 尺寸策略QWidget::sizePolicy()
,在上述处理之后,那么再根据各个控件的尺寸调整策略决定控件应该尽可能拉伸还是尽量不拉伸。
策略的基本标志位:enum QSizePolicy::PolicyFlag
以下这些标志组合在一起形成各种策略值(Policy values):
常量 | 值 | 描述 |
---|---|---|
QSizePolicy::GrowFlag | 1 | 可增长标志,如果有必要的话,可以在建议尺寸之外继续增长。 |
QSizePolicy::ExpandFlag | 2 | 尽量扩展标志,能占多大空间就占多大。 |
QSizePolicy::ShrinkFlag | 4 | 可收缩标志,如果有必要的话,可以在缩小到建议尺寸之后继续缩小。 |
QSizePolicy::IgnoreFlag | 8 | 忽略建议尺寸,这个增长方式最野蛮,能占多大空间就占多大空间。 |
策略的枚举常量:enum QSizePolicy::Policy
该枚举描述了在构建QSizePolicy
时使用的各种每个维度的大小调整类型。
常量 | 值 | 拉伸特点 | 描述 |
---|---|---|---|
QSizePolicy::Fixed | 0 | 固定 | QWidget::sizeHint() 是唯一可接受的选择,因此小部件永远不会增长或缩小(例如,一个按钮的垂直方向)。以建议尺寸固定住,对于水平方向是固定宽度,垂直方向是固定高度。 |
QSizePolicy::Minimum | GrowFlag | 被动拉大 | sizeHint() 的大小是最小的,也足够使用。小部件可以扩展,但变大没有任何优势(例如,推按钮的水平方向)。它不能比sizeHint() 提供的尺寸更小。以建议尺寸为最小尺寸,如果有多余的空间就拉伸,没有多余的空间就保持建议尺寸。被动扩张。 |
QSizePolicy::Maximum | ShrinkFlag | 被动缩小 | sizeHint() 是一个最大值。如果其他小部件需要空间(例如分隔线),则该小部件可以缩小任意量而不会有任何损害。它不能大于sizeHint() 提供的尺寸。以建议尺寸为最大尺寸,窗口缩小时,如果其他控件需要,该控件可以尽量缩小为其他控件腾出空间。 |
QSizePolicy::Preferred | GrowFlag|ShrinkFlag | 被动伸缩 | sizeHint() 是最好的,但小部件可以被缩小并仍然有用。小部件可以被扩展,但是比sizeHint() 更大没有任何优势(默认的QWidget policy )。以建议尺寸为最佳尺寸,能屈能伸,窗口缩小时可以为其他控件腾出空间,窗口变大时,也可以占据其他控件不需要的空闲空间。基类 QWidget 默认是这种策略。被动扩张。 |
QSizePolicy::Expanding | GrowFlag|ShrinkFlag|ExpandFlag | 主动扩张 | sizeHint() 是一个合理的大小,但是小部件可以缩小并仍然有用。小部件可以利用额外的空间,因此应尽可能获得更多的空间(例如,水平滑块的水平方向)。建议尺寸仅仅是明智的建议,但控件基本不采用。这个模式也是能屈能伸,但它倾向于主动扩张,它会尽可能占据新增的区域。 |
QSizePolicy::MinimumExpanding | GrowFlag|ExpandFlag | 主动扩张 | sizeHint() 是最小的,也是足够的。小部件可以利用额外的空间,因此它应该获得尽可能多的空间(例如水平滑块的水平方向)。以建议尺寸作为最小尺寸,主动扩张,尽可能占据新增的区域。 |
QSizePolicy::Ignored | ShrinkFlag|GrowFlag|IgnoreFlag | 野蛮扩张 | sizeHint() 被忽略。小部件将获得尽可能多的空间。忽略建议尺寸,虽然能屈能伸,但是它会尽最大可能占据空间。 |
Qt 里面的控件默认策略也是基本符合下面三条建议:
① 如果希望控件尺寸在水平或垂直方向固定住,那么把该维度的策略设置为 QSizePolicy::Fixed
。
② 如果希望控件被动拉伸,其他控件不需要空间时这个控件才会占据新增区域,那么可以用 QSizePolicy::Preferred
(尺寸下限是隐含的最小建议尺寸)或者 QSizePolicy::Minimum
(尺寸下限是建议尺寸)。
③ 如果希望控件尽量拉伸,主动扩张,那就把策略设置为 QSizePolicy::Expanding
。