【问题标题】:Qt Signals and Slot connected twice... what happens?Qt Signals 和 Slot 连接了两次......会发生什么?
【发布时间】:2011-04-01 15:06:57
【问题描述】:

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

机制是如何处理的?

【问题讨论】:

    标签: qt signals-slots


    【解决方案1】:

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

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

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

    正如@Job 在他的一个 cmets 中指出的那样(他值得称赞,所以请不要为他的工作投票给我),Qt::UniqueConnection 将阻止这个问题。

    【讨论】:

    • 请注意,您可以使用Qt::UniqueConnection 来防止这种情况发生。
    • @Job:我会在其中添加一个答案。我不知道它已被添加到 Qt 中。感谢您指出。
    • @Troubadour:我不想劫持 San Jacinto 的答案 :-) 也许他可以将其添加到他的答案中。
    • @Job:你不会劫持任何答案。当您发表评论时,没有人提到 Qt::UniqueConnection
    • @Troubadour:是的,但问题是实际发生了什么,而不是如何预防。
    【解决方案2】:

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

    还有一些注意事项:

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

    【讨论】:

    • 我不太确定这是一个更优雅的解决方案。通常代码应该是对称的,如果不是,那就是一个错误。我担心Qt::UniqueConnection 用于修补草率的非对称代码的次数可能比用于任何其他目的的次数要多。
    • 是的,可以说两种“连接一次”的方法都不好。 OTOH,如果您从其他地方收到一个对象,可能是同一个对象的多次,而您所要做的就是听一些信号(一次),那么我能想到的唯一其他方法就是保留列表您已经看到的对象。也不好看。而且 disconnect()、connect() 有点脆弱,因为如果发生变化,必须注意使它们保持同步。所以我更喜欢UniqueConnection。在实践中,我没有经常看到“连接一次”的方法,所以这似乎不是一个大问题。
    • +1 指向 Qt::UniqueConnection 的指针(我之前不知道)
    【解决方案3】:

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

    请注意,拥有多个连接不一定是错误的。它有(可能)完全有效的用途。它们非常罕见,我当然想不出任何时候我将它用作功能。我能回忆起的所有存在多重连接的情况都证明是错误而不是预期。

    【讨论】:

    • 好的,moc 文件中到底有什么?它没有能力处理这种编程错误的场景吗?
    • @itapadar:我认为他们不会费心去阻止它,因为它可能不是是一个错误。不久前我写了一些代码,在某些情况下实际上依赖于该功能。
    • @itapadar:实际上回想起来我根本没有使用它作为一个功能。它显示为一个错误,我不得不解决它。
    • 一个有用的例子是调用多个不相关函数的计时器。您可以编写一个函数来调用这些多个不相关的函数,或者将计时器信号连接到每个函数
    猜你喜欢
    • 2015-08-18
    • 2014-06-24
    • 2013-08-05
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多