C++ 是否立即强制处理Qt自定义信号?

C++ 是否立即强制处理Qt自定义信号?,c++,qt,signals-slots,C++,Qt,Signals Slots,我有一个关于Qt及其信号/插槽机制的问题。 我创建了一个自定义小部件,并在其中创建了一个自定义的信号(ShowMessage)。此信号连接到插槽,该插槽在我的主窗口的状态栏中显示消息(以及指定的超时) 现在,我的类中有一个操作需要很长时间才能执行,它阻塞了UI。我希望在开始操作之前发出我的信号,当操作完成后,再次发出以更新状态栏;大概是这样的: emit ShowMessage(message, timeout); // Do the long operation emit ShowMessag

我有一个关于Qt及其信号/插槽机制的问题。
我创建了一个自定义小部件,并在其中创建了一个自定义的
信号
(ShowMessage)。此信号连接到
插槽
,该插槽在我的主窗口的状态栏中显示消息(以及指定的超时)

现在,我的类中有一个操作需要很长时间才能执行,它阻塞了UI。我希望在开始操作之前发出我的信号,当操作完成后,再次发出以更新状态栏;大概是这样的:

emit ShowMessage(message, timeout);
// Do the long operation
emit ShowMessage(newMessage, timeout);
但我的问题是,Qt似乎一直等到整个操作完成,并且只使用
newMessage
更新状态栏
有没有办法“强制”立即处理我的信号,因为如果我想求助于线程,那么我的生活会变得更加复杂

有没有办法“强制”立即处理我的信号

是的,有::-。 显示第一条消息后,请致电。这将强制在调用点处理所有挂起事件。比如说,

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

非常感谢您的回答:)它修复了最初的问题,但它在我的应用程序中产生了另一个问题。我不知道您对OpenGL有多熟悉,但我正在我的应用程序中调用本机API OpengGL方法,现在我在调用
glDrainElements
时收到“访问冲突错误”。你知道这里发生了什么吗?我不知道添加这个方法和我的OpenGL之间有什么联系calls@Farzad您正在同步编码。不要这样做,你的问题就会消失。从事件循环调用的所有内容(因此,连接到Qt信号的所有插槽)都需要快速运行才能完成。您的信号会立即被处理,但由于您阻止了事件循环,小部件永远不会有机会重新绘制自己。不能阻止事件循环。如果您需要在GUI线程中执行长时间处理,那么可以分小块执行,作为对零持续时间计时器过期的反应。不要重复进入<代码> PraseServices < /代码>,它可以重新输入你的代码,我认为它是坏建议。@库巴伯,你能在你提到的计时器上详细说明一下吗?我是Qt新手,我将它用作调用OpenGL函数的容器。我的“long”操作实际上是从文件加载(和缓冲)模型,所以我不知道使用timer@Farzad把你的长手术分解成许多短手术。要启动操作,您可以
连接(新的QTimer(this),&QTimer::timeout,this,&MyClass::myOperation)
myOperation
应该在每次调用它时执行大量工作,然后返回。完成工作后,应通过执行
delete sender()
来取消计时器。作为概念证明,这是最简单的方法,当然不需要动态分配计时器。那么,有没有一种方法可以这样做:创建一个计时器并启动操作,从计时器中知道操作已完成?我的意思是,一种等待手术结束并继续我们之前所做的手术的方法,这种漫长的手术是什么?为什么很难将其移动到新线程?是否使用Qt::DirectConnection进行连接这应确保您的信号已立即得到处理。如果不是,则应使用调试器单步执行并查看发生了什么。我假设这一切都发生在同一个GUI线程中?抱歉,但我不明白您所说的
Qt::DirectionConnection
是什么意思。我不熟悉Qt,我将它用作OpenGL绘图的容器。@thuga长操作实际上是OpenGL调用加载模型(并缓冲其数据);我不知道如何在一个单独的线程中完成它