python - pyqtsignal - custom signal pyqt
slots de desconexión pyqt. Nuevo estilo (2)
Asigno una ranura con esto.
...
self.query = QtGui.QLineEdit(self)
self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.connect(lambda: self.launchNavigator(1))
...
pero ¿cómo puedo desconectar? Intenté con esto pero no funciona ...
self.query.textChanged.disconnect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.disconnect(lambda: self.launchNavigator(1))
Las expresiones lambda devuelven diferentes funciones que (más o menos por casualidad;)) harán lo mismo. Por lo tanto, a lo que conectaste tu señal no es lo mismo que la segunda lambda que estás usando cuando intentas desconectarla; mira este ejemplo:
>>> f = lambda x: x
>>> g = lambda x: x
>>> f is g
False
Puede usar self.query.textChanged.disconnect()
sin ningún parámetro, lo que desconectará la señal de todas las ranuras (lo cual podría estar bien si solo tiene esa conexión) o tendrá que almacenar una referencia a la lambda en algún lugar :
self.func1 = lambda: self.makeThread(self.googleSearch())
self.query.textChanged.connect(self.func1)
...
self.query.textChanged.disconnect(self.func1)
Me gustaría agregar una advertencia / extensión a la respuesta de @ rainer relacionada con los métodos enlazados. Tenga en cuenta que vincular un método a una instancia (por ejemplo, al escribir self.slotname
) realmente crea un nuevo cierre cada vez (como en esta pregunta).
Por lo tanto, tendrías el mismo problema de hacer
def test_slot(self):
self.makeThread(self.googleSearch())
...
self.query.textChanged.connect(self.test_slot)
...
self.query.textChanged.disconnect(self.test_slot)
como lo hiciste con el lambda
original en tu pregunta. La solución es almacenar el cierre self.test_slot
en un atributo, como @rainer sugiere. Esto es necesario porque se genera un nuevo objeto que es más o menos equivalente a lambda: type(self).test_slot(self)
cada vez que escribe self.test_slot
en su código. Lo siguiente funcionará bien siempre y cuando realice la contabilidad con precisión:
self.func = self.test_slot
self.query.textChanged.connect(self.func)
...
self.query.textChanged.disconnect(self.func)