2009-11-14 136 views
18

如果我有一类A,其中其功能之一的作用:Qt:事件是否按顺序处理?

void A::func() 
{ 
    emit first_signal(); 
    emit second_signal(); 
} 

假设B类有2个插槽,一个连接到first_signal,另一个到second_signal,是它保证,所述插槽连接到first_signal将始终处理之前插槽second_signal

回答

15

如果你使用信号和插槽之间的直接连接类型(Qt :: DirectConnection),那么答案是肯定的。

从Qt的帮助系统:

当一个信号被发射时,与它相连的槽 通常执行 立即,就像一个正常 函数调用。发生这种情况时,信号和插槽机制完全是独立于任何GUI事件循环的 。 一旦所有 插槽已返回,将执行 发出语句后面的代码。当使用排队的 连接时,情况是 略有不同;在这种情况下,发射关键字后面的代码 将立即继续,并且 将在稍后执行。

您可以在QObject::connect方法中将默认连接类型更改为enum Qt::ConnectionType中的任何一个。

+1

我认为,只要它们具有相同的类型,即使它不是默认值,也会得到保证。排队的人会创建两个事件,每个事件具有相同的优先级,然后按顺序处理这些事件。此外,默认的连接类型是Qt :: AutoConnection,只要发射器和接收器都在同一个线程中,就可以解析为直接连接。 – 2009-11-14 14:03:49

+3

你的帖子的开始句应该是'如果你在信号和插槽之间使用DIRECT连接类型;因为默认类型是'Qt :: AutoConnection',它的行为有所不同,取决于发送代码和接收对象是否存在于不同的线程中。参见['Qt :: ConnectionType'文档](http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum)和[Threads,Events and QObjects](http:// qt- project.org/wiki/Threads_Events_QObjects)。 – Hossein 2013-05-10 07:01:17

+2

如果您选择Qt :: QueuedConnection(或Qt :: AutoConnection,并且该插槽与信号处于不同的线程中),当然该插槽将被异步调用,但我认为问题依然存在:“是否保证插槽连接到first_signal的数据将始终在second_signal插槽之前处理?“任何人都有答案? – 2016-01-15 10:45:23

相关问题