53

如果相同的信号和插槽连接两次会发生什么?

机制如何处理?

4

3 回答 3

55

几周前,我们有一个实习生不小心将一个信号连接到一个插槽不止一次。这个想法是,在一种情况下,您将插槽连接到信号,而在另一种情况下,您将断开它。当你改变模式时,你会做适当的工作。

好吧,他忘了在适当的时候断开连接。因此,每次更改模式时,您都会与插槽建立新的连接。

最终结果?1 次连接 == 1 次调用插槽。2 个连接 == 2 次插槽调用。3 个连接 == 3 个对插槽的调用,等等。这些调用“同时”发生(我知道实际上它们没有发生,因为它们在同一个事件线程上,但我的意思是所有调用都是连续处理的)。

正如@Job 在他的一条评论中指出的那样(他值得称赞,所以请不要为他的工作投票给我),Qt::UniqueConnection这将防止这个问题。

于 2010-08-20T12:12:32.600 回答
8

通常是坏事。将插槽连接两次甚至更多次是完全可以接受的,但是当信号被触发时,您的插槽将为您建立的每个连接调用,这可能不是您想要的。

请注意,拥有多个连接不一定是错误的。它有(可能)完全有效的用途。它们非常罕见,我当然想不出任何时候我将它用作功能。我能回忆起的所有有多重连接的情况都被证明是一个错误而不是故意的。

于 2010-08-20T11:58:06.443 回答
8

该插槽被执行多次(正如其他人已经说过的那样)。

还有一些注意事项:

  • 以前,在以前可能存在连接的情况下,“仅连接一次”的模式是先调用断开连接,然后再连接以强制执行一个连接。
  • 现在,从 4.6 开始,还有更优雅的 Qt::UniqueConnection,参见http://doc.qt.io/qt-5/qt.html#ConnectionType-enum
于 2010-08-20T12:41:46.747 回答