2013-03-24 5 views
5

나는 이것을 가진 슬롯을 할당한다.pyqt 연결 해제 슬롯. 새로운 스타일

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

어떻게 연결을 해제 할 수 있습니까? 나는이 함께 노력하지만

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

답변

11

는 람다 표현식 (더 많거나 우연히 이하) 다른 기능 반환 ... 작동하지 않습니다) 같은 일을 할 것입니다. 따라서 신호를 연결 한 것은 연결을 끊으려고 할 때 사용하고있는 두 번째 람다와 같은 것이 아닙니다. 이 예제 참조 : 당신은 (당신이 하나 개의 연결 만하는 것이있을 경우 확인이 될 수 있음) 모든 슬롯에서 신호를 분리 할, 매개 변수없이 self.query.textChanged.disconnect()를 사용할 수 있습니다

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

또는 당신은 저장해야합니다 어딘가에 람다 참조 :

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

나는 바인딩 방법에 관한 @의 라이너의 대답에주의/확장을 추가하고 싶습니다. 메서드를 인스턴스에 바인딩하면 (예 : self.slotname 작성) 실제로 매번 새 클로저가 만들어집니다 (this 질문과 같이).

당신은 때문에 같은 문제는 귀하의 질문에 원래 lambda했던 것처럼

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

... 

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

... 

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

을하고있을 것입니다. 해결책은 @rainer가 제안하는 것처럼 클로저를self.test_slot 속성에 저장하는 것입니다. 이는 코드에 self.test_slot을 작성할 때마다 lambda: type(self).test_slot(self)과 대략 동일한 새 오브젝트가 생성되기 때문에 필요합니다. 정확하게 책을 보관하는 한 다음 내용은 올바르게 작동합니다.

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

... 

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