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

4 layout qt

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

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

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

任何帮助将不胜感激!我花了一天的大部分时间在这上面。

马龙

qua*_*sse 7

我遇到了这个确切的问题,无法在 Internet 上的任何地方找到答案。调用Layout.update()、Layout.activate()、 或widget.adjustSize()(所有地方都建议)都不起作用。

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

唯一可靠工作的是

layout->addWidget(myLabel);
myLabel->show();
size = myLabel->size();
Run Code Online (Sandbox Code Playgroud)

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


Rei*_*ica 6

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

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

  1. 实现一个自定义小部件,它将与布局正确交互,不断增长以填充布局的可用宽度。也许您只需要一个大小策略和一种消除文本的方法?

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