QSizePolicy说明

相关代码

一般设置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
    };

官方说明:

GrowFlagThe widget can grow beyond its size hint if necessary.必要时可以大于sizeHint()。
ExpandFlagThe widget should get as much space as possible.尽可能获得更大的空间。
ShrinkFlagThe widget can shrink below its size hint if necessary.必要时可以小于sizeHint()。
IgnoreFlagThe 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()也会被忽略。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值