2013-03-24 19 views
5

Assegno uno slot con questo.pyqt disconnette gli slot. Nuovo stile

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

ma come si disconnette? Ho provato con questo, ma non funziona ...

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

risposta

11

Le espressioni lambda ritorno diverse funzioni che (più o meno per caso;)) farà la stessa cosa. Pertanto, ciò a cui hai collegato il tuo segnale non è la stessa cosa del secondo lambda che stai usando quando tenti di disconnetterlo; vedere questo esempio:

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

È possibile utilizzare self.query.textChanged.disconnect() senza alcun parametro, che scollegare il segnale da tutti slot (che potrebbe essere ok se avete solo quella connessione) o si dovrà memorizzare un riferimento al lambda da qualche parte:

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

vorrei aggiungere un avvertimento/estensione alla risposta @ di Rainer relative ai metodi rilegati. Tieni presente che il collegamento di un metodo a un'istanza (ad esempio, scrivendo self.slotname) crea effettivamente una nuova chiusura ogni volta (come nella domanda this).

Si avrebbe quindi lo stesso problema facendo

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

... 

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

... 

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

come avete fatto con l'originale lambda nella sua interrogazione. La soluzione è di memorizzare la chiusura self.test_slot in un attributo, come suggerisce @rainer. Ciò è necessario perché un nuovo oggetto che equivale approssimativamente a lambda: type(self).test_slot(self) viene generato ogni volta che si scrive self.test_slot nel codice. Quanto segue funzionerà bene fino a quando effettui la contabilità in modo accurato:

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

... 

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