这让我疯了。我有一个自定义菜单类,当设置可见时,显示位于特定文件夹中的项目列表。当按下硬件按钮时,我的应用程序获取最新的项目列表,用它们填充菜单,然后返回。
显示这些项目的菜单使用填充了自定义小部件的QListWidget。每个小部件在水平布局中包含一个或多个QLabel,并在显示菜单时创建。为了根据可用的菜单宽度调整显示的文本,我需要根据布局调整QLabel的大小,但是在菜单对用户可见之前。问题是,在构建列表的所有函数都返回之前,我的布局不会更新。
我已经尝试了QApplication :: ProcessEvents()和布局更新功能,但是在返回之前,他们都没有更新我的QLabel的值。我可以在最初按下按钮时设置QTimer,让它显示菜单,更新项目,然后自行停止,但这似乎是一个糟糕的解决方案。
真的很感激任何帮助!我花了大半天的时间来做这件事。
马龙答案 0 :(得分:3)
如何在返回前更新QLayout并获取新尺寸?
别。你不打算这样做。它会让你“疯狂”,因为你正在倒退。布局更新是从事件循环异步处理的。而不是立即获得布局尺寸,让自己成为系统的一部分。一些选项是:
实现可与布局正确交互的自定义窗口小部件,以增加布局的可用宽度。也许您只需要一个尺寸政策和elide text的方式?
制作一个自定义布局,将您的用例的特殊属性考虑在内。
答案 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()
。这将强制布局重新计算。