问:事件是否按顺序处理?

siv*_*udh 19 qt signals-slots

如果我有一个A类,它的一个功能是:

void A::func()
{
    emit first_signal();
    emit second_signal();
}
Run Code Online (Sandbox Code Playgroud)

假设B类有2个插槽,一个连接到first_signal,和另一对second_signal中,它保证该连接的时隙first_signal总是被处理之前second_signal时隙?

Wil*_*cat 15

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

从Qt帮助系统:

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

您可以更改默认的连接类型中的任何枚举的Qt :: ConnectionType的QObject ::连接方法.

  • 如果您选择Qt :: QueuedConnection(或Qt :: AutoConnection并且插槽与信号位于不同的线程中),当然插槽将被异步调用,但我认为问题仍然存在"是否保证插槽连接到first_signal将始终在second_signal插槽之前处理?" 有人得到答案吗? (4认同)
  • 你的帖子的开头句子应该是`如果你在信号和插槽之间使用DIRECT连接类型'; 因为默认类型是`Qt :: AutoConnection`,它的行为会有所不同,具体取决于发送代码和接收对象是否存在于不同的线程中.参见[`Qt :: ConnectionType` docs](http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum)和[Threads,Events and QObjects](http:// qt- project.org/wiki/Threads_Events_QObjects). (3认同)