【问题标题】:How to disconnect a signal from a slot which is a lambda?如何从 lambda 插槽断开信号?
【发布时间】:2015-02-21 13:42:42
【问题描述】:

假设槽接受一个参数,例如,

    self._nam = QtNetwork.QNetworkAccessManager(self)
    # ...
    response = self._nam.get(request)
    self.timer.timeout.connect(lambda: self.on_reply_finished(response))

信号如何从插槽断开?以下给出错误Failed to disconnect signal timeout().

    self.timer.timeout.disconnect(lambda: self.on_reply_finished(response))

是不是因为 lambda 不是“真正的”插槽,而是 Python 技巧?在那种情况下,如何将响应参数传递给插槽(不使 response 成为成员)?

谢谢

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

    不,这是因为这两个 lambda 不是同一个对象。

    您需要将相同的引用传递给您在connect 方法中使用的disconnect 方法。如果您使用匿名 lambda 函数,除了在信号上调用 disconnect()(不带参数)之外,没有其他方法可以断开它,但这会断开 所有 连接的信号。

    【讨论】:

      【解决方案2】:

      仅当您传递相同的 lambda 时:

      self._on_timeout = lambda: self.on_reply_finished(response)
      self.timer.timeout.connect(self._on_timeout)
      # ...
      self.timer.timeout.disconnect(self._on_timeout)
      

      您可能希望将函数附加到计时器:

      self.timer.on_timeout = lambda: self.on_reply_finished(response)
      self.timer.timeout.connect(self.timer.on_timeout)
      # ...
      self.timer.timeout.disconnect(self.timer.on_timeout)
      

      顺便说一句,你 can use functools.partial 而不是 lambda。

      【讨论】:

      • 请详细说明使用 functools.partial 而不是 lambda 有什么好处,特别是如果它会像 lambda 一样防止信号槽内存泄漏?
      • @Rhdr 它不会防止内存泄漏,它可以用于other reasons
      猜你喜欢
      • 2014-02-18
      • 2019-02-12
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多