25

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

    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

4 回答 4

30

您应该能够在输入代码之前处理事件队列;

#include <QApplication>

并且,当您想刷新 GUI 时,请致电;

qApp->processEvents();

请注意,让您的长时间运行的进程不时调用该函数可能是个好主意,以使您的 GUI 感觉更灵敏。

于 2012-09-13T16:12:13.513 回答
15

如果你不关心你的 GUI 在这段时间内是否响应,那么调用my_label->repaint()就可以了。除非您屈服于事件循环,否则 Qt 无法自动为您做任何事情。

为了获得最大的响应能力,您可以考虑在单独的线程中运行您的进程,并在处理完成时使用信号/插槽连接(默认情况下是线程安全的)向您的主 GUI 线程发出信号。

于 2012-09-13T16:23:30.913 回答
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();

希望这可以帮助某人。

于 2014-11-13T19:09:43.443 回答
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元素触发的信号。

于 2019-02-06T13:04:26.250 回答