Qt - 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()不生效的问题,大致解决方案就是:
setFixedSize(1, 1);
setVisible(true) //或者 show();
setGeometry();
————————————————
版权声明:本文为CSDN博主「wangw8507」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangw8507/article/details/116913653
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义