一般设置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 };如果不考虑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();
当其他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()也会被忽略。