pyqt断开插槽.新风格

Fel*_*les 7 python signals pyqt disconnect slot

我为此分配了一个插槽.

...
self.query = QtGui.QLineEdit(self)            
self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.connect(lambda: self.launchNavigator(1))
...
Run Code Online (Sandbox Code Playgroud)

但我怎么能断开连接?我试过这个,但它不起作用......

self.query.textChanged.disconnect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.disconnect(lambda: self.launchNavigator(1))
Run Code Online (Sandbox Code Playgroud)

rai*_*ner 13

lambda表达式返回不同的函数(或多或少偶然;))将执行相同的操作.因此,您将信号连接到的内容与您尝试断开连接时使用的第二个lambda不同; 看这个例子:

>>> f = lambda x: x
>>> g = lambda x: x
>>> f is g
False
Run Code Online (Sandbox Code Playgroud)

您可以使用self.query.textChanged.disconnect()不带任何参数,这将断开所有插槽的信号(如果您只有一个连接可能没问题),或者您必须在某处存储对lambda的引用:

self.func1 = lambda: self.makeThread(self.googleSearch())
self.query.textChanged.connect(self.func1)
...
self.query.textChanged.disconnect(self.func1)
Run Code Online (Sandbox Code Playgroud)


mka*_*kam 5

有一种优雅的方法可以使用原始连接返回的 QConnection 对象来断开信号。所以:

self.conn1 = self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.conn2 = self.query.returnPressed.connect(lambda: self.launchNavigator(1))
Run Code Online (Sandbox Code Playgroud)

然后随后:

self.disconnect(self.conn1)
self.disconnect(self.conn2)
Run Code Online (Sandbox Code Playgroud)

尽管该功能在 Qt 中已经存在很长时间了,但在 PyQt 5.13.1 之前并未实现。

  • 这绝对应该是公认的答案,这是最干净的方法。 (3认同)