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

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

机制如何处理?

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

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

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

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

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

请注意,有多个连接不一定是错误的。 有(可能)完全有效的用途。 他们是非常罕见的,我当然想不出任何时候我用它作为一个function。 所有的情况下,我可以记得有多个连接,结果是一个错误,而不是打算。

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

更多的注意事项:

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