2011-12-24 83 views
7

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

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

我明白,你可以摧毁所有的连接和新秩序重建他们模拟这种效果,但是这不是我问。我无法在API或一般文档中找到任何内容,所以我怀疑答案是否定的,但我认为我应该问不管怎样...

回答

10

seemed to be the past understanding相反,我很惊讶地看到更新(在至少在最近的版本)的Qt没有离开槽的调用顺序为未定义:

如果几个时隙被连接到一个信号,该时隙将被执行的一个前一后,他们的顺序已经被连接,当信号被发射时。

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

(虽然可能有人会说那一个文档中的一个句子是不够的,代表所有Qt 4.x的版本的过去和未来“强”的保证。)

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

你可能会研究的一件事是让你的老虎机排队而不是直接采取行动。然后,当所有插槽都被调用时,您会处理该队列......考虑一些优先级属性。

+0

同意。就像我在我的问题中提到的那样,我认识到这是设计缺陷,但API开发人员应该给我们提供我们需要的一切以摆脱困境,无论它是否优雅。我原以为这将是一个明显的例子,但根据在互联网上甚至没有查询它的情况来判断,显示我在那里显然是错误的! – cmannett85 2011-12-24 15:33:45

+0

正如有两种政治自由(“自由”和“自由”),API设计有两种强大的功能。在这种情况下,我认为没有提供重新排列信号的能力是很好的,它似乎与声称有合同订单不一致。 *耸肩* http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ – HostileFork 2011-12-24 15:54:23

0

QObject内部将连接存储为列表。使用<private/qobject_p.h>标头获取发件人连接列表上的锁定并对其条目重新排序很简单。一个公共API会在每个主要Qt修订期间修正这个细节,这被认为是太有限了。