Qt信号和插槽连接两次...会发生什么?

问题描述:

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

该机制如何处理?

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

那么,他忘了在适当时断开连接。所以每次你改变模式,你都有一个新的连接到插槽。

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

正如@Job在他的一个评论中指出的那样(他值得信任,所以请不要赞扬我的工作),Qt::UniqueConnection将会阻止这个问题。

+1

+1:这是经典的场景。 – Troubadour 2010-08-20 12:18:09

+53

请注意,您可以使用[Qt :: UniqueConnection](http://doc.trolltech.com/latest/qt.html#ConnectionType-enum)来防止这种情况。 – Job 2010-08-20 12:32:27

+0

@工作:我会添加一个答案与它。我不知道这已经被添加到Qt。感谢您指出。 – Troubadour 2010-08-20 12:34:26

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

请注意,多连接并不一定是错误的。有(可能)完全有效的用途。它们非常罕见,我当然想不到任何时候我将它用作功能。我记得所有的情况下,有多个连接的情况都证明是一个错误,而不是有意的。

+0

好吧,在建设部的文件究竟是什么呢?它是否有能力处理这种编程错误的情况? – itapadar 2010-08-20 11:59:36

+0

@itapadar:我不认为他们打算阻止它,因为它可能不是一个错误。我不久前写了一些代码,在某些情况下实际依赖于该功能。 – Troubadour 2010-08-20 12:02:06

+0

@itapadar:实际上,在回想我没有把它当作一个功能。它看起来像一个bug,我不得不解决它。 – Troubadour 2010-08-20 12:14:15

插槽被执行多次(正如其他人所说)。

一些更多的注意事项:

  • 从前,在案件“连接恰好一次”的模式,其中有可能曾经有过的连接,是第一个电话断开连接,然后连接到执行只有一个连接。
  • 现在,由于4.6,还有更优雅的Qt :: UniqueConnection,看到http://doc.qt.io/qt-5/qt.html#ConnectionType-enum
+0

我不太确定这是更优雅的解决方案。通常代码应该是对称的,如果它不是那么那是一个错误。我担心'Qt :: UniqueConnection'可能会被用来修补不规则的代码,而不是用于任何其他目的。 – Troubadour 2010-08-20 12:51:41

+0

是的,人们可以争辩说,“连接一次”的方法都不好。 OTOH,如果你从别的地方得到一个物体,有可能多次是同一个物体,而你所要做的只是听一些信号(一次),那么我唯一能想到的另一种方式是保留你已经看到的物体。也不好。 而disconnect(),connect()有点脆弱,因为如果有变化,必须小心保持它们同步。所以我更喜欢UniqueConnection。在实践中,我看不到“连接一次”的方法,所以这似乎不是一个大问题。 – 2010-08-20 13:30:59

+0

对于指向Qt :: UniqueConnection的指针+1(我之前不知道) – 2013-06-04 23:53:29