2011-02-10 47 views
13

如何在应用布局规则后预览窗口中小部件的大小,之前我实际上是show()小部件窗口?看起来在初始show()命令之前,所有尺寸都是100x30。我该如何解决这个问题?如何在show()之前预览窗口小部件的大小?

+0

你需要什么这个? – 2011-02-10 22:05:09

+0

我自己的小部件窗口类,检查对象的大小和添加动态小部件在施工时间。我需要在该阶段的布局之后测量事物的大小。 – JasonGenX 2011-02-10 22:47:34

回答

9

invalidate()为我工作。

请注意,如果你这样做了以下它的工作如下要求(至少它似乎是在我的代码罚款):

widget->show(); 
widget->layout()->invalidate(); 
widget->hide(); 

这并不显示在屏幕上的小部件,因为你不直到hide()发生,才放弃对队列的控制。在这之间,invalidate()计算正确的位置。

4

你可以尝试使用Google的“展前QT几何”,这显示了qtcentre.org论坛题为Force geometry update of hidden widget一个线程在那里你可以阅读Wysota答案:

你可以叫上 无效()布局。它应该重新计算自己 然后。如果不是,那么有这个秘密 属性,说服部件它 正在显示,然后你应该是 能够强制其布局 重新计算。但首先尝试其他的东西 ,这不是很可靠的东西 。

的Qt :: WA_WState_ExplicitShowHide设置为 真实和Qt :: WA_WState_Hidden设置为 假。确保在 实际在屏幕上显示小部件之前,还原值 (特别是第二个)。

2

使用QWidget :: sizeHint根据所有子窗口小部件和布局的大小提示获取所需的顶级窗口小部件大小。或者调用QWidget :: adjustSize来实际运行布局并调整整个小部件树的大小。请注意,adjustSize将顶级窗口限制为屏幕的2/3,因此您可能无法获得大窗口所需的内容。

6

对于我来说,下面的工作:

window->layout()->update() 
window->layout()->activate() 

这可能真的一样Alexis的答案,但它并不需要显示,当时躲在窗口。

1

我想他人所发布的各种解决方案(show & hideupdate & activateinvalidateWA_WState_ExplicitShowHide & WA_WState_Hidden),但没有一个与所有的部件,我不得不中心前在我的应用程序中调用show()正确。我花了数小时挖掘,我的问题是不正确的尺寸被缓存在QWidgetItemV2。几分钟后,我想出了这个:

for(auto*child:widget->findChildren<QWidget*>()){child->updateGeometry();} 
widget->updateGeometry(); 
相关问题