在进入单独的函数之前强制Qt GUI更新

时间:2012-09-13 16:05:27

标签: c++ qt function user-interface

这似乎应该是自动的,但显然不是。我有以下代码:

    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正在更新? 感谢。

4 个答案:

答案 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元素触发的信号。