更改信号槽连接顺序

7
我最近遇到了一个代码问题,这是由于某些行为取决于特定对象中的信号槽连接顺序所导致的。这是我自己的设计缺陷(连接始终应该是动态的,所以这种缺陷是不可避免的),但这让我想起了一些问题。
是否可以重新排列对象中的信号槽连接?或者在创建连接时指定连接的“索引”?
我知道你可以通过销毁所有的连接并按新的顺序重新创建它们来模拟这种效果,但这不是我想要的。我在API或常规文档中找不到任何信息,因此我认为答案是否定的,但我还是想问问...
2个回答

10

过去的理解似乎相反, 令我惊讶的是在最近的版本中,Qt并没有将slot调用顺序作为未定义的状态:

如果一个信号连接了多个槽,当信号被发射时,这些槽将按照它们被连接的顺序一个接一个地执行。

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

(尽管有人可能会认为在那份文件中的一句话不足以代表所有Qt 4.X版本过去和未来的“强大”保证。)
似乎没有API可以重新排序信号和槽。 即使有,我认为依赖顺序并不是一个很好的想法。 我建议重新考虑设计。
你可以调查的一件事是使你的槽将它们的操作排队而不是直接采取行动。 然后,当所有槽都被调用时,您将处理该队列...考虑某些优先级属性。

同意。就像我在问题中提到的那样,我认识到这是设计缺陷,但API开发人员应该为我们提供一切必要的东西,以便我们能够摆脱困境,无论它是否优雅。我本以为这是一个显而易见的问题,但根据互联网上甚至没有关于它的查询,显示我显然是错的! - cmannett85
就像政治自由有“自由”和“免于”的两种形式一样,API设计中也有两种强大的形式。在这种情况下,我认为不提供重新排序信号的能力是可以接受的,因为它似乎与合同顺序的断言不协调。 耸肩 http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ - HostileFork says dont trust SE

0

QObject 内部将连接存储为列表。使用<private/qobject_p.h>头文件获取发送者的连接列表并重新排序其条目是一件简单的事情。一个公共 API 将会使这个细节在每个主要 Qt 修订版的持续时间内固定,而这被视为过于限制。


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