2016-02-29 94 views
1

我有一个关于Qt及其信号/插槽机制的问题。
我已经创建了一个自定义小部件,并且我创建了一个自定义SIGNAL(ShowMessage)。该信号连接到SLOT,它在我的主窗口的状态栏中显示消息(以及指定的超时)。强制Qt自定义信号立即被处理?

现在,我在我的课上有一个操作需要很长时间来执行,并且它阻止了用户界面。我希望emit我的信号在开始操作之前,当它结束时,emit它再次更新状态栏;是这样的:

emit ShowMessage(message, timeout); 
// Do the long operation 
emit ShowMessage(newMessage, timeout); 

但我的问题是,它似乎是Qt的等待,直到整个操作完成,并只更新与newMessage状态栏。
有没有办法以某种方式“强制”我的信号立即处理,因为如果我想诉诸线程,那么我的生活会变得更加复杂!

+0

这个长期操作是什么?为什么很难将其移至新线程? – thuga

+0

你使用Qt :: DirectConnection连接吗? - 这应确保您的信号已经立即处理完毕。如果不是,那么你应该使用调试器来查看发生了什么。我假设这一切都发生在同一个GUI线程? –

+0

对不起,但我不明白'Qt :: DirectionConnection'的含义。我是Qt的新手,我将它用作OpenGL图形的容器。 – Farzad

回答

2

有没有办法以某种方式 “逼” 我的信号立即处理

,有。 :-)。 显示第一条信息后,请致电QCoreApplication::processEvents()。这迫使所有未决事件在呼叫点处理。例如,

emit ShowMessage(message, timeout); 
QCoreApplication::processEvents(); 
// Do the long operation 
emit ShowMessage(newMessage, timeout); 
+0

非常感谢您的回答:) 它修复了最初的问题,但它在我的应用程序中创建了另一个问题。我不知道你对OpenGL有多熟悉,但我在我的应用程序中调用了本地API OpengGL方法,现在当调用'glDrawElements'时我收到“访问冲突错误”。你知道这里发生了什么吗? 我不知道添加此方法和我的OpenGL调用之间的连接是什么 – Farzad

+0

@Farzad您正在同步编码。不要,你的问题会消失。从事件循环中调用的所有东西(所有连接到Qt信号的插槽)都需要快速完成。你的信号*被立即处理,但是因为你阻塞了事件循环,所以小部件从来没有机会重新绘制自己。您不能阻止事件循环。如果您需要在GUI线程中进行长时间处理,则需要对其进行小块处理,作为对零时长定时器过期的反应。不要递归到'processEvents'中,它可以重新输入你的代码,我认为这是不好的建议。 –

+0

@KubaOber你能详细谈谈你提到的计时器吗?我是Qt新手,我将它用作调用OpenGL函数的容器。我的“长期”操作实际上是从文件加载(和缓冲)模型,所以我不知道你的意思是使用计时器 – Farzad