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

zeb*_*bra 24 c++ user-interface qt function

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

    ui.my_label->setText("Test 1...");
    ui.my_label->adjustSize();

    processThatTakesAbout30SecondsToFinish(files[0].toStdString());

    ui.my_label->setText("Finished.");
    ui.my_label->adjustSize();
Run Code Online (Sandbox Code Playgroud)

发生的事情是我从未看到"Test1...",GUI似乎挂起,直到下面的函数完成,并且我通常只看到"完成.".

如何在进入该功能之前确保GUI正在更新?
谢谢.

Joa*_*son 26

如果您在输入代码之前,您可以处理事件队列;

#include <QApplication>
Run Code Online (Sandbox Code Playgroud)

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

qApp->processEvents();
Run Code Online (Sandbox Code Playgroud)

请注意,让您的长时间运行进程不时调用该函数可能是一个好主意,以使您的GUI感觉更具响应性.

  • 这肯定会有用,虽然我通常会尝试建议不要调用`processEvents`,因为如果你的代码不可重入,它会导致很多意想不到的问题. (2认同)

Chr*_*ris 14

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

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