2013-03-24 21 views
5

Przydzielam do tego slot.Gniazda rozłączające pyqt. Nowy styl

... 
self.query = QtGui.QLineEdit(self)    
self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch())) 
self.query.returnPressed.connect(lambda: self.launchNavigator(1)) 
... 

, ale jak mogę się rozłączyć? Próbowałem z tym, ale to nie działa ...

self.query.textChanged.disconnect(lambda: self.makeThread(self.googleSearch())) 
self.query.returnPressed.disconnect(lambda: self.launchNavigator(1)) 

Odpowiedz

11

Wyrażenia lambda powrócić różne funkcje (mniej lub bardziej przez przypadek;)) zrobi to samo. Dlatego to, do czego podłączyłeś swój sygnał, nie jest tym samym, co druga lambda, z której korzystasz, próbując ją odłączyć; patrz poniższy przykład:

>>> f = lambda x: x 
>>> g = lambda x: x 
>>> f is g 
False 

można użyć self.query.textChanged.disconnect() bez żadnych parametrów, które należy odłączyć sygnał z wszystkich gniazdach (która może być ok, jeśli masz tylko jedno połączenie) lub trzeba będzie przechowywać odniesienie do lambda gdzieś:

self.func1 = lambda: self.makeThread(self.googleSearch()) 
self.query.textChanged.connect(self.func1) 
... 
self.query.textChanged.disconnect(self.func1) 
0

Chciałbym dodać zastrzeżenie/rozszerzenie do odpowiedzi @ Rainera odnoszące się do metod związanych. Należy pamiętać, że powiązanie metody z instancją (np. Poprzez napisanie self.slotname) faktycznie tworzy nowe zamknięcie za każdym razem (jak w pytaniu this).

Można by zatem mają ten sam problem robi

def test_slot(self): 
    self.makeThread(self.googleSearch()) 

... 

    self.query.textChanged.connect(self.test_slot) 

... 

    self.query.textChanged.disconnect(self.test_slot) 

jak to było z oryginalnym lambda w swoim pytaniu. Rozwiązaniem jest przechowywanie zamknięciaself.test_slot w atrybucie, jak sugeruje @rainer. Jest to konieczne, ponieważ nowy obiekt, który jest mniej więcej równoważny z lambda: type(self).test_slot(self), jest generowany za każdym razem, gdy piszesz kod self.test_slot. Następujące elementy będą działały prawidłowo, o ile dokładnie prowadzisz księgowanie:

self.func = self.test_slot 
    self.query.textChanged.connect(self.func) 

... 

    self.query.textChanged.disconnect(self.func)