Qt信号和插槽连接两次。。。会发生什么?
如果同一信号和插槽连接两次会发生什么情况Qt信号和插槽连接两次。。。会发生什么?,qt,signals-slots,Qt,Signals Slots,如果同一信号和插槽连接两次会发生什么情况 机制是如何处理的?通常是坏事。连接插槽两次甚至更多次是完全可以接受的,但当信号被触发时,您的插槽将为您进行的每个连接调用,这可能不是您想要的 请注意,拥有多个连接并不一定是错误的。它(可能)有完全有效的用途。它们非常罕见,我肯定想不出有哪一次我把它作为一个功能。我能回忆起的所有多重连接的情况都被证明是一个错误,而不是故意的。几周前,我们有一名实习生多次意外地将信号连接到插槽。这个想法是,在一种情况下,你会有插槽连接到信号,在另一种情况下,你会断开它。当你
机制是如何处理的?通常是坏事。连接插槽两次甚至更多次是完全可以接受的,但当信号被触发时,您的插槽将为您进行的每个连接调用,这可能不是您想要的
请注意,拥有多个连接并不一定是错误的。它(可能)有完全有效的用途。它们非常罕见,我肯定想不出有哪一次我把它作为一个功能。我能回忆起的所有多重连接的情况都被证明是一个错误,而不是故意的。几周前,我们有一名实习生多次意外地将信号连接到插槽。这个想法是,在一种情况下,你会有插槽连接到信号,在另一种情况下,你会断开它。当你改变模式时,你会做适当的工作 嗯,他忘了在适当的时候断开连接。因此,每次更改模式时,都会有一个新的插槽连接 最终结果如何?1个连接==1个插槽调用。2个连接==对插槽的2个调用。3个连接==3个对插槽的调用,等等。这些调用“同时”发生(我知道实际上它们没有,因为它们在同一事件线程上,但我的意思是所有调用都是连续处理的)
正如@Job在他的一篇评论中指出的那样(他值得表扬,所以请不要因为他的工作而对我投赞成票),这将阻止这个问题的发生 插槽被执行多次(正如其他人所说) 还有一些注意事项:
- 在以前,在以前可能有连接的情况下,“只连接一次”的模式是首先调用disconnect,然后连接以强制执行一个连接
- 现在,从4.6开始,还有更优雅的Qt::UniqueConnection,请参见
Qt::UniqueConnection
。@Troubadour:是的,但问题是实际发生了什么,而不是如何预防。我不确定这是一个更优雅的解决方案。通常代码应该是对称的,如果不是对称的,那就是错误。我担心Qt::UniqueConnection
可能会被用来修补草率的非对称代码,而不是用于任何其他目的。是的,有人会说两种“一次连接”的方法都不好。OTOH,如果你从其他地方得到一个物体,可能是同一物体的多次,你所要做的就是听一些信号(一次),那么我能想到的唯一其他方法就是保存你已经看到的物体的列表。也不好。而disconnect()、connect()则有点脆弱,因为如果发生变化,必须注意保持它们的同步。所以我更喜欢独一无二的连接。在实践中,我经常看到两种方法都不是“连接一次”,所以这似乎不是什么大问题