首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在进入单独的函数之前强制更新Qt GUI

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

Stack Overflow用户
提问于 2012-09-14 00:05:27
回答 4查看 32.5K关注 0票数 25

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

代码语言:javascript
复制
    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在进入该函数之前正在更新?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-14 00:12:14

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

代码语言:javascript
复制
#include <QApplication>

当你想刷新你的图形用户界面时,调用;

代码语言:javascript
复制
qApp->processEvents();

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

票数 28
EN

Stack Overflow用户

发布于 2012-09-14 00:23:31

如果您不关心图形用户界面在这段时间内的响应,那么调用my_label->repaint()就可以了。Qt不能自动为您做任何事情,除非您屈从于事件循环。

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

票数 15
EN

Stack Overflow用户

发布于 2014-11-14 03:09:43

我只想补充一点,对我来说,这是我在这里看到的两个答案的组合。所以对我来说起作用的是:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12410433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档