相关代码
一般设置QSizePolicy用接口:
inline void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical);
QSizePolicy::Policy是枚举类型,其原型:
enum Policy {
Fixed = 0,
Minimum = GrowFlag,
Maximum = ShrinkFlag,
Preferred = GrowFlag | ShrinkFlag,
MinimumExpanding = GrowFlag | ExpandFlag,
Expanding = GrowFlag | ShrinkFlag | ExpandFlag,
Ignored = ShrinkFlag | GrowFlag | IgnoreFlag
};
这里又需要知道下面这个枚举:
enum PolicyFlag {
GrowFlag = 1,
ExpandFlag = 2,
ShrinkFlag = 4,
IgnoreFlag = 8
};
官方说明:
GrowFlag | The widget can grow beyond its size hint if necessary. | 必要时可以大于sizeHint()。 |
ExpandFlag | The widget should get as much space as possible. | 尽可能获得更大的空间。 |
ShrinkFlag | The widget can shrink below its size hint if necessary. | 必要时可以小于sizeHint()。 |
IgnoreFlag | The widget’s size hint is ignored. The widget will get as much space as possible. | 忽略sizeHint(),尽可能获得更大的空间 |
如果不考虑minimumSize和maximumSize,或着说minimumSize=0且maximumSize=16777215时,sizeHint()就是临时的最小值或最大值,例如:
设置GrowFlag时,必须大于等于sizeHint();
设置ExpandFlag 时,必须大于等于sizeHint();
设置ShrinkFlag 时,必须小于等于sizeHint();
设置IgnoreFlag 时,大小随便,优先让layout中其他控件的满足sizeHint();
易混淆点
GrowFlag和ShrinkFlag比较好理解,GrowFlag就是说可以大于sizeHint(),ShrinkFlag就是可以小于sizeHint()。ExpandFlag、GrowFlag和IgnoreFlag不好区分,GrowFlag比ExpandFlag多了个“必要时”,IgnoreFlag比ExpandFlag多了个"忽略sizeHint()"。
GrowFlag和ExpandFlag、IgnoreFlag的区别:这个“必要时”指的是总空间足够大(大于所有widget的sizeHint()之和)时,其他widget都没有ExpandFlag或IgnoreFlag标志时,GrowFlag就可以超过sizeHint()了,如果某个widget有ExpandFlag或IgnoreFlag,那么ExpandFlag或IgnoreFlag会先超过sizeHint(),而GrowFlag由于没必要放大,会继续保持sizeHint()大小。
ExpandFlag只有空间足够大时优先级比GrowFlag大,但在空间不足时,不起作用。而IgnoreFlag在空间足够大时具有ExpandFlag的作用,同时在空间不足时,具有具有比ShrinkFlag先缩小的权力。
空间足够大,空间占用优先级:ExpandFlag == IgnoreFlag > GrowFlag > ShrinkFlag==0;优先级最大且大于等于GrowFlag的widget会变大,其他的保持sizeHint();
空间不够(只需要一个widget缩小到sizeHint()以下就可以),缩小优先级IgnoreFlag > ShrinkFlag > 0 = GrowFlag == ExpandFlag,优先级最大且大于等于ShrinkFlag 的widget会缩小,其他的保持sizeHint();
总结
enum PolicyFlag {
GrowFlag = 1, // 可以大于sizeHint(),但有点难为情。
ExpandFlag = 2, // 大于sizeHint()时,无所谓。(必须同时设置GrowFlag)
ShrinkFlag = 4, // 可以小于sizeHint(),但有点难为情。
IgnoreFlag = 8 // 大于小于sizeHint(),都无所谓。(必须同时设置GrowFlag和ShrinkFlag )
};
enum Policy {
Fixed = 0, // 必须是sizeHint(),认定它了
Minimum = GrowFlag, // 可以大于sizeHint(),但有点难为情。
Maximum = ShrinkFlag, // 可以小于sizeHint(),但有点难为情。
Preferred = GrowFlag | ShrinkFlag, // 可以大于或小于sizeHint(),但有点难为情。
MinimumExpanding = GrowFlag | ExpandFlag, // 可以大于sizeHint(),无所谓。
Expanding = GrowFlag | ShrinkFlag | ExpandFlag, // 可以大于或小于sizeHint(),但小于时有点难为情,大于时无所谓。
Ignored = ShrinkFlag | GrowFlag | IgnoreFlag // 可以大于或小于sizeHint(),大于小于都无所谓。
};
当其他widget都不能变时,如果你可以变,即使难为情也要变。如果其他widget要么不能变要么难为情,而你无所谓,那其他的都不变,你变就行了。如果大家都一样,那么大家一起变或不变。
补充
1、有缩放因子的情况下,不管难不难为情,只要可以变都要遵守比例因子,但是不能变的情况下坚决不能变,保持sizeHint()。
2、当minimumSize和maximumSize是默认值(minimumSize=0且maximumSize=16777215)时,可能会有一个推荐的最大值和最小值(即minimumSizeHint()和maximumSizeHint()),比如Qlabel和QPushButton控件的minimumSizeHint()就是可以放下它的文本的大小。如果设置了minimumSize和maximumSize,那么minimumSizeHint()和maximumSizeHint()就失效。不管是推荐的最大值和最小值,还是手动设置的最大值最小值,它的优先级都比sizeHint()高,毕竟sizeHint()只是个推荐值,最大值和最小值是强制范围。
3、Ignored不仅会忽略sizeHint(),minimumSizeHint()和minimumSizeHint()也会被忽略。