如何在show()之前预览布局中小部件的大小?

时间:2011-02-10 21:57:00

标签: qt

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

5 个答案:

答案 0 :(得分:9)

invalidate()为我工作。

请注意,如果您执行以下操作,它将按照此处的要求工作(至少在我的代码中似乎没问题):

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

这不显示屏幕上的小部件,因为在hide()发生之前您不会将控制权交还给队列。在这两者之间,invalidate()计算正确的位置。

答案 1 :(得分:8)

对我来说,以下工作:

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

这可能与Alexis的回答相同,但它不需要显示 - 然后隐藏窗口。

答案 2 :(得分:3)

您可以尝试使用Google搜索“qt geometry before show”,在qtcentre.org论坛上显示标题为Force geometry update of hidden widget的主题,您可以在其中阅读 Wysota 答案:

  

你可以调用invalidate()   布局。它应该重新计算自己   然后。如果不是那么就有这个秘密   使小部件信服它的属性   正在展示,然后你应该   能够强制布局   重新计算。但尝试其他事情   首先,这不是非常的事情   可靠。

和这个

  

Qt :: WA_WState_ExplicitShowHide设置为   true和Qt :: WA_WState_Hidden设置为   假。请务必还原值   (特别是第二个)在你之前   实际上在屏幕上显示小部件。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我尝试了其他人发布的各种解决方案(show& hideupdate& activateinvalidateWA_WState_ExplicitShowHide& ; WA_WState_Hidden)但是在我的应用程序中调用show()之前,我必须居中的所有小部件都不正确。我花了几个小时挖掘,我的问题是在 QWidgetItemV2 中缓存了不正确的大小。几分钟后,我想出了这个:

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