这看起来应该是自动的,但显然不是。我有以下代码:
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在进入该函数之前正在更新?
谢谢。
发布于 2012-09-14 00:12:14
在输入代码之前,您应该能够处理事件队列;
#include <QApplication>
当你想刷新你的图形用户界面时,调用;
qApp->processEvents();
请注意,让您的长时间运行的流程不时地调用该函数可能是一个好主意,以使您的GUI感觉更具响应性。
发布于 2012-09-14 00:23:31
如果您不关心图形用户界面在这段时间内的响应,那么调用my_label->repaint()
就可以了。Qt不能自动为您做任何事情,除非您屈从于事件循环。
为了获得最大的响应速度,您可以考虑在单独的线程中运行进程,并使用信号/槽连接(默认情况下是线程安全的)在处理完成时向主GUI线程发出信号。
发布于 2014-11-14 03:09:43
我只想补充一点,对我来说,这是我在这里看到的两个答案的组合。所以对我来说起作用的是:
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();
希望这对某些人有帮助。
https://stackoverflow.com/questions/12410433
复制相似问题