signal pyqtsignal example custom python pyqt signals disconnect slot

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)