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

时间:2010-08-20 11:56:26

标签: qt signals-slots

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

该机制是如何处理的?

3 个答案:

答案 0 :(得分:48)

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

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

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

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

答案 1 :(得分:6)

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

请注意,拥有多个连接并不一定是错误的。它(可能)是完全有效的用途。它们非常罕见,我当然无法想到我曾经将它作为一种功能使用过。我记得有多个连接的所有情况都证明是一个错误而非预期。

答案 2 :(得分:5)

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

更多说明:

  • 以前,在之前可能存在连接的情况下,“仅连接一次”的模式是首先调用disconnect,然后连接以强制执行一个连接。
  • 现在,从4.6开始,还有更优雅的Qt :: UniqueConnection,请参阅http://doc.qt.io/qt-5/qt.html#ConnectionType-enum