如何从一个lambda槽中断开信号?

时间:2015-02-20 11:06:34

标签: python pyqt

假设插槽有一个参数,例如,

    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成为成员)?

由于

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

只有你传递相同的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。