我为此分配了一个插槽。
...
self.query = QtGui.QLineEdit(self)
self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.connect(lambda: self.launchNavigator(1))
...
但我怎么能断开连接?我试过这个,但它不起作用......
self.query.textChanged.disconnect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.disconnect(lambda: self.launchNavigator(1))
答案 0 :(得分:11)
lambda表达式返回不同的函数(或多或少偶然;))将执行相同的操作。因此,您将信号连接到的内容与您尝试断开连接时使用的第二个lambda不同;看这个例子:
>>> f = lambda x: x
>>> g = lambda x: x
>>> f is g
False
您可以使用self.query.textChanged.disconnect()
而不使用任何参数,这将断开所有插槽的信号(如果您只有一个连接可能没问题),或者您必须存储某处对lambda的引用:
self.func1 = lambda: self.makeThread(self.googleSearch())
self.query.textChanged.connect(self.func1)
...
self.query.textChanged.disconnect(self.func1)
答案 1 :(得分:0)
我想在@ rainer关于绑定方法的答案中添加一个警告/扩展。请记住,将方法绑定到实例(例如,通过编写self.slotname
)实际上每次都会创建一个新的闭包(如this问题中所示)。
因此,你会遇到同样的问题
def test_slot(self):
self.makeThread(self.googleSearch())
...
self.query.textChanged.connect(self.test_slot)
...
self.query.textChanged.disconnect(self.test_slot)
正如您在问题中对原始lambda
所做的那样。解决方案是将闭包 self.test_slot
存储在属性中,正如@rainer建议的那样。这是必要的,因为每次在代码中编写lambda: type(self).test_slot(self)
时都会生成一个大致相当于self.test_slot
的新对象。只要您准确地进行簿记,以下内容将正常工作:
self.func = self.test_slot
self.query.textChanged.connect(self.func)
...
self.query.textChanged.disconnect(self.func)
答案 2 :(得分:0)
有一种绝妙的方法,可以使用原始连接返回的QConnection对象断开信号。所以:
self.conn1 = self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.conn2 = self.query.returnPressed.connect(lambda: self.launchNavigator(1))
然后随后:
self.disconnect(self.conn1)
self.disconnect(self.conn2)
此功能在PyQt 5.13.1之前没有实现,尽管它在Qt中已经存在很长时间了。