1 把setFixedSize的大小加大后的确可以解决
2 当时笔记本外接的显示屏,当把外接显示屏去掉就没有问题了
可能导致setGeometry()不生效的原因:
1)部件尚未显示:如果部件尚未显示在屏幕上,setGeometry()函数将不会生效。您需要首先通过show()或raise()函数将部件显示在屏幕上。
2)布局限制:如果部件是在一个布局中,布局限制可能会影响setGeometry()函数的行为。在这种情况下,您需要使用布局相关的函数来调整部件的位置和大小,例如QGridLayout、QHBoxLayout或QVBoxLayout等。
3)父部件的限制:如果部件的父部件设置了限制,例如setMaximumSize()或setMinimumSize()等,这可能会影响子部件的几何属性。在这种情况下,您需要调整父部件的限制或者将子部件添加到另一个不受限制的部件中。
4)绘图环境问题:在某些情况下,setGeometry()函数可能不会立即反映在屏幕上,这可能是由于绘图环境的延迟更新。您可以尝试调用update()或repaint()函数来强制部件重新绘制。
5)代码执行速度:在某些情况下,由于代码执行速度过快,可能会导致setGeometry()函数在程序运行过程中未被正确执行。您可以尝试使用QTimer或类似的技术来延迟执行setGeometry()函数,以确保在程序运行时正确执行。
6)没有正确设置初始大小:setGeometry()函数只在部件被创建时设置一次初始大小。如果你在部件创建后多次调用setGeometry(),那么只有第一次调用会生效。你需要通过其他方式(例如,通过resize()函数)来改变部件的大小。
Qt中setGeometry的理解
如果在控件中加上了layout布局,就会发现发现没有办法使用setGeometry函数了,这是因为布局已经被layout管理,没你啥事了。
但是父控件被layout管理,父控件的子控件却没有啊 ,所以在创建子控件的时候,需要指定子控件的父控件是谁。这样子控件就可以使用
setGeometry函数,可以自由的调整位置,但是只能在父控件的范围内调整位置,同时必须注意setGeometry之后一定要调用show函数,
否则可能看不到控件存在。
开发过程中经常碰到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();
综上:解决方案为:窗口设置了固定大小导致了布局失效,所以解决问题也很简单,只需要保证在窗口刷新之前,窗口已经显示:也就是窗口部件的刷新,应该放在窗口显示之后,另外...