Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt信号和插槽连接两次。。。会发生什么?_Qt_Signals Slots - Fatal编程技术网

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

Qt信号和插槽连接两次。。。会发生什么?,qt,signals-slots,Qt,Signals Slots,如果同一信号和插槽连接两次会发生什么情况 机制是如何处理的?通常是坏事。连接插槽两次甚至更多次是完全可以接受的,但当信号被触发时,您的插槽将为您进行的每个连接调用,这可能不是您想要的 请注意,拥有多个连接并不一定是错误的。它(可能)有完全有效的用途。它们非常罕见,我肯定想不出有哪一次我把它作为一个功能。我能回忆起的所有多重连接的情况都被证明是一个错误,而不是故意的。几周前,我们有一名实习生多次意外地将信号连接到插槽。这个想法是,在一种情况下,你会有插槽连接到信号,在另一种情况下,你会断开它。当你

如果同一信号和插槽连接两次会发生什么情况


机制是如何处理的?

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


请注意,拥有多个连接并不一定是错误的。它(可能)有完全有效的用途。它们非常罕见,我肯定想不出有哪一次我把它作为一个功能。我能回忆起的所有多重连接的情况都被证明是一个错误,而不是故意的。

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

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

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


正如@Job在他的一篇评论中指出的那样(他值得表扬,所以请不要因为他的工作而对我投赞成票),这将阻止这个问题的发生

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

还有一些注意事项:

  • 在以前,在以前可能有连接的情况下,“只连接一次”的模式是首先调用disconnect,然后连接以强制执行一个连接
  • 现在,从4.6开始,还有更优雅的Qt::UniqueConnection,请参见

好的,moc文件中到底有什么内容?难道它没有能力处理这种编程错误的情况吗?@itapadar:我认为他们不会费心去阻止它,因为这可能不是一个错误。不久前,我写了一些代码,在某些情况下实际上依赖于该功能。@itapadar:事实上,回想起来,我根本没有将其作为功能使用。一个有用的例子是一个调用多个不相关函数的计时器。您可以编写一个函数来调用这些多个不相关的函数,或者只需将计时器信号连接到每个函数。注意,您可以使用它来防止出现这种情况。@Job:我会在其中添加一个答案。我不知道这已经添加到Qt中。谢谢你指出这一点。@Troubador:我不想劫持San Jacinto的答案:-)也许他可以把它添加到他的答案中。@Job:你不会劫持任何答案。当你发表评论时,没有人提到过
Qt::UniqueConnection
。@Troubadour:是的,但问题是实际发生了什么,而不是如何预防。我不确定这是一个更优雅的解决方案。通常代码应该是对称的,如果不是对称的,那就是错误。我担心
Qt::UniqueConnection
可能会被用来修补草率的非对称代码,而不是用于任何其他目的。是的,有人会说两种“一次连接”的方法都不好。OTOH,如果你从其他地方得到一个物体,可能是同一物体的多次,你所要做的就是听一些信号(一次),那么我能想到的唯一其他方法就是保存你已经看到的物体的列表。也不好。而disconnect()、connect()则有点脆弱,因为如果发生变化,必须注意保持它们的同步。所以我更喜欢独一无二的连接。在实践中,我经常看到两种方法都不是“连接一次”,所以这似乎不是什么大问题