更改信号槽连接顺序

时间:2011-12-24 14:04:41

标签: qt signals-slots

我最近遇到了我的代码问题,这是由某些行为依赖于特定对象中的信号槽连接顺序引起的。这是我的一个设计缺陷(连接总是意味着动态,所以这个缺陷是不可避免的),但它让我思考。

  

是否可以重新排序对象中的信号槽连接?   和/或在创建连接时指定连接的“索引”?

我很欣赏你可以通过破坏所有连接并以新的顺序重新创建它来模拟这种效果,但这不是我要求的。我在API或一般文档中找不到任何内容,所以我怀疑答案是否定的,但我认为无论如何我应该问...

2 个答案:

答案 0 :(得分:10)

seemed to be the past understanding相反,我很惊讶地读到了一个更新(至少在最近的版本中)Qt没有将插槽调用的顺序保留为未定义:

  

如果有多个插槽连接到一个信号,则在发出信号时,插槽将按照它们连接的顺序依次执行。

http://doc.qt.io/qt-4.8/signalsandslots.html#signals

(尽管有人可能会争辩说,该文件中的一句话并不足以代表过去和未来所有Qt 4.X版本的强大"保证。)

似乎没有用于重新排序信号和插槽的API。即使有,我也觉得依赖订单并不是一个好主意。我建议重新考虑设计。

你可能会调查的一件事就是让你的插槽排队他们的行动,而不是直接采取行动。然后,当调用所有插槽时,您将处理该队列...考虑一些优先级属性。

答案 1 :(得分:0)

QObject在内部将连接存储为列表。使用<private/qobject_p.h>标头获取发件人连接列表上的锁并重新排序其条目是一件简单的事情。公共API会在每个主要Qt版本的持续时间内修复此细节,这被视为限制太多。