这似乎应该是自动的,但显然不是。我有以下代码:
ui.my_label->setText("Test 1...");
ui.my_label->adjustSize();
processThatTakesAbout30SecondsToFinish(files[0].toStdString());
ui.my_label->setText("Finished.");
ui.my_label->adjustSize();
发生的事情是我永远不会看到"Test1...",
,因为在以下函数完成之前,GUI似乎一直挂起,而且我只能看到“已完成”。
如何在进入该功能之前确保GUI正在更新? 感谢。
答案 0 :(得分:26)
如果您在输入代码之前,您可以处理事件队列;
#include <QApplication>
并且,当您想刷新GUI时,请致电;
qApp->processEvents();
请注意,让您的长时间运行进程暂时调用该函数可能是一个好主意,以使您的GUI感觉更具响应性。
答案 1 :(得分:14)
如果你不关心你的GUI在这段时间内是否有响应,那么调用my_label->repaint()
就可以了。除非你屈服于事件循环,否则Qt不能自动为你做任何事情。
为了获得最大响应,您可以考虑在单独的线程中运行您的进程,并使用信号/插槽连接(默认情况下是线程安全的)在处理完成时向您的主GUI线程发出信号。
答案 2 :(得分:3)
我只是想补充一点,对我来说这是我在这里看到的两个答案的组合。那对我有用的是:
ui.my_label->setText("Test 1...");
ui.my_label->adjustSize();
//! Both of these lines needed
ui.my_label->repaint();
qApp->processEvents();
processThatTakesAbout30SecondsToFinish(files[0].toStdString());
ui.my_label->setText("Finished.");
ui.my_label->adjustSize();
希望这有助于某人。
答案 3 :(得分:0)
定义功能...
void YourClass::Update_Ui()
{
if(this->isEnabled())
return;
this->repaint();
qApp->processEvents();
}
...像这样,并确保禁用this
(以防止用户操作),而您想强制更新ui
是我的最佳解决方案。
示例如何在函数内部使用它(例如,在耗时的堆栈处理过程中):
this->setEnabled(false);
//Do whatever you want
Update_Ui();
//Do some other stuff
this->setEnabled(true);
这不允许用户通过ui
交互(已禁用)来干扰处理,并且每次在代码中调用Update_Ui();
时都进行更新,而不会更新整个ui
,只是选择的标签或其他内容。请注意,这不会阻止ui
元素触发的信号。