QWidget::setGeometry()不生效问题解决方案

开发过程中经常碰到setGeometry()不生效的问题,发现只要在setGeometry()之前调用一下show()或者setVisible(true)就可以了!

问题就出在setVisible(true)!!!

setVisible()会判断当前控件的WA_WState_Created属性,意思就是看看控件是否已经创建了window,如果为没有创建,就调用create()方法创建一个window,坏就坏在这里!跟代码发现QT为控件创建新窗口时,会自动校正window的geometry,也就是说之前设置的geometry会被冲掉!也是够操蛋的。

既然第一次显示窗口会触发create()将之前的geometry冲掉,那就干脆在setGeometry()之前先把控件显示出来!果然,位置显示正确。

问题还没结束!

前面说了,第一次show()不仅会将控件显示出来,而且还是自动计算位置,这个位置并不是我们希望控件出现的位。等我们调用setGeometry()重新设置位置后,控件窗口就会从初始位置调到我们设置的位置,呈现出一个跳动的现象。好难啊!!!

为了解决这个跳动问题,想了一个取巧的办法:显示控件之前,调用setFixedSize()将控件固定大小设置为(1, 1)(这个属性设置貌似不会受create()的影响),这样就算控件显示出来基本也是看不出来的,然后再顺序调用show()和setGeometry()。目标达成!

所以,解决setGeometry()不生效的问题,大致解决方案就是:

1. setFixedSize(1, 1);
2. setVisible(true) 或者 show();
3. setGeometry();
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值