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

Qt 如何在show()之前预览布局中小部件的大小?,qt,Qt,在应用布局规则后,如何预览窗口中小部件的大小,在我实际show()小部件窗口之前?在最初的show()命令之前,似乎所有尺寸都是100x30。我该怎么做呢?你可以在谷歌上搜索“qt geometry before show”,它在qtcenter.org论坛上显示了一个标题为“Wysota答案”的帖子: 可以在上调用invalidate() 布局。它应该重新计算自己 那么。如果没有,那么这就是秘密 属性,使小部件相信它 正在显示,然后你应该 能够强制其布局 重新计算。但是尝试其他事情 首先,这不

在应用布局规则后,如何预览窗口中小部件的大小,在我实际
show()
小部件窗口之前?在最初的
show()
命令之前,似乎所有尺寸都是100x30。我该怎么做呢?

你可以在谷歌上搜索“qt geometry before show”,它在qtcenter.org论坛上显示了一个标题为“Wysota答案”的帖子:

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

还有这个

Qt::WA_WState_ExplicitShowHide设置为 true和Qt::WA_WState_Hidden设置为 错。请确保还原这些值 (尤其是第二个)在你面前 在屏幕上实际显示小部件

invalidate()
对我有效

请注意,如果您执行以下操作,它将按照这里的要求工作(至少在我的代码中看起来是不错的):


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

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

对于我来说,以下操作有效:

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

这可能与亚历克西斯的回答相同,但不需要先显示然后隐藏窗口

我尝试了其他人发布的各种解决方案(
show
&
hide
update
&
activate
invalidate
WA\u WState\u Hidden
),但在调用应用程序中的
show()
之前,我必须集中的所有小部件都不正确。我花了数小时挖掘,但问题是在QWidgetItemV2中缓存了不正确的大小。几分钟后,我想到了这个:

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

MY own widget window类,检查对象的大小并在构建时添加动态小部件。我需要测量在那个阶段布局后事物的大小。这也为我带来了窍门!我试着把我的窗口放在屏幕中央。它一直处于关闭状态,直到我在窗口居中之前添加了这两条线。
for(auto*child:widget->findChildren<QWidget*>()){child->updateGeometry();}
widget->updateGeometry();