QObject上槽函数的调用顺序

41

我有一个QObject,它有多个slot连接到其中一个信号。当信号被发射时,这些slot按照何种顺序被调用?

4个回答

61
在Qt v4.5及更早版本中: 不会,可以在这里的文档中看到:如果一个信号连接了多个槽函数,当信号被发射时,这些槽函数将按照任意顺序依次执行。
编辑: 从4.6版本开始,这不再是真的了。现在,这些槽函数将按照它们被连接的顺序运行。相关段落的最新文档如下所示:
如果一个信号连接了多个槽函数,当信号被发射时,这些槽函数将按照它们被连接的顺序依次执行。

1
@Hossein 我的答案在QT 4.6版本之前是正确的。如果你看一下问题的日期(以及我的答案),你会发现当时这是正确的答案。请注意,Yaroslav的答案是在一年多之后发布的。 - sepp2k
2
好的,对不起我并不是想贬低你的帖子。由于这个问题出现在我做的谷歌搜索的第一个结果中,我想阻止更多的读者产生混淆。 - Hossein
1
你需要使用队列连接才能确保不同线程之间的正确性。只是这样说而已。 - smsware

12

2

尽管顺序未定义,但在所有Qt版本中,直到现在,它都是connect()的顺序,除非使用Qt::QueuedConnection,在这种情况下,当emit返回时,甚至不能保证已执行任何或所有槽。不过,仍然不建议依赖顺序。


1
依赖于插槽执行的顺序是一个非常糟糕的想法,因为它违背了信号/插槽连接的精神,并且如果您进行任何程序化的信号和插槽连接,会让您面临不良行为的风险。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接