如何在返回之前更新QLayout并获取新尺寸?

时间:2011-10-24 22:33:57

标签: qt layout

这让我疯了。我有一个自定义菜单类,当设置可见时,显示位于特定文件夹中的项目列表。当按下硬件按钮时,我的应用程序获取最新的项目列表,用它们填充菜单,然后返回。

显示这些项目的菜单使用填充了自定义小部件的QListWidget。每个小部件在水平布局中包含一个或多个QLabel,并在显示菜单时创建。为了根据可用的菜单宽度调整显示的文本,我需要根据布局调整QLabel的大小,但是在菜单对用户可见之前。问题是,在构建列表的所有函数都返回之前,我的布局不会更新。

我已经尝试了QApplication :: ProcessEvents()和布局更新功能,但是在返回之前,他们都没有更新我的QLabel的值。我可以在最初按下按钮时设置QTimer,让它显示菜单,更新项目,然后自行停止,但这似乎是一个糟糕的解决方案。

真的很感激任何帮助!我花了大半天的时间来做这件事。

马龙

4 个答案:

答案 0 :(得分:3)

  

如何在返回前更新QLayout并获取新尺寸?

别。你不打算这样做。它会让你“疯狂”,因为你正在倒退。布局更新是从事件循环异步处理的。而不是立即获得布局尺寸,让自己成为系统的一部分。一些选项是:

  1. 实现可与布局正确交互的自定义​​窗口小部件,以增加布局的可用宽度。也许您只需要一个尺寸政策和elide text的方式?

  2. 制作一个自定义布局,将您的用例的特殊属性考虑在内。

答案 1 :(得分:2)

我有这个确切的问题,无法在互联网上的任何地方找到答案。调用Layout.update()Layout.activate()widget.adjustSize()(所有在不同地方建议)均无效。

我有一个垂直布局的小部件,我想添加一个QLabel,然后立即使用QLabel的大小。

唯一可行的是

layout->addWidget(myLabel);
myLabel->show();
size = myLabel->size();

在您从函数返回并允许Qt事件循环进行或自己手动调用show()之前,布局似乎不会重新计算。

答案 2 :(得分:1)

您是否尝试过使用layout()->update();

答案 3 :(得分:0)

您想在父窗口小部件上调用QWidget::adjustSize()。这将强制布局重新计算。