2013-03-24 9 views
5

Ich weise damit einen Slot zu.pyqt Trennschlitze. Neuer Style

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

aber wie kann ich trennen? Ich habe versucht, mit diesem aber es funktioniert nicht ...

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

Antwort

11

Die Lambda-Ausdrücke geben verschiedene Funktionen, die (mehr oder weniger durch Zufall;)) wird das gleiche tun. Daher ist das, mit dem Sie Ihr Signal verbunden haben, nicht dasselbe wie das zweite Lambda, das Sie verwenden, wenn Sie versuchen, es zu trennen. siehe folgendes Beispiel:

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

Sie entweder self.query.textChanged.disconnect() ohne Parameter verwenden können, die das Signal von alle Schlitze trennen wird (was in Ordnung sein könnte, wenn man nur diese eine Verbindung) oder Sie müssen speichern ein Bezug auf das Lambda irgendwo:

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

ich mag eine Einschränkung/Erweiterung @ rainer Antwort auf in den gebundenen Methoden betreffen. Denken Sie daran, dass das Binden einer Methode an eine Instanz (z. B. durch Schreiben von self.slotname) tatsächlich jedes Mal eine neue Schließung verursacht (wie in der Frage this).

Sie würden daher das gleiche Problem

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

... 

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

... 

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

tun haben, wie Sie mit dem Original lambda in Ihrer Frage tat. Die Lösung besteht darin, die Schließungself.test_slot in einem Attribut zu speichern, wie @rainer vorschlägt. Dies ist erforderlich, da jedes Mal, wenn Sie in Ihrem Code self.test_slot schreiben, ein neues Objekt generiert wird, das ungefähr lambda: type(self).test_slot(self) entspricht. Das Folgende funktioniert gut, solange Sie die Buchhaltung genau führen:

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

... 

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