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

लैम्ब्डा भाव अलग कार्यों कि (अधिक या संयोग से कम;) वापसी) एक ही बात करेंगे। इसलिए, जो आपने अपना सिग्नल कनेक्ट किया है वह उतना ही नहीं है जितना कि दूसरा लैम्ब्डा जिसे आप डिस्कनेक्ट करने का प्रयास करते समय उपयोग कर रहे हैं; इस उदाहरण देखें:

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

आप किसी भी पैरामीटर के बिना self.query.textChanged.disconnect() उपयोग कर सकते हैं, जो सभी स्लॉट से संकेत डिस्कनेक्ट हो जाएगा (ठीक अगर आप केवल यह है कि एक कनेक्शन है हो सकता है) या आप एक स्टोर करने के लिए होगा कहीं लैम्ब्डा के संदर्भ:

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

मैं बाध्य तरीकों से संबंधित @ रेनर के जवाब देने के लिए एक चेतावनी/एक्सटेंशन जोड़ना चाहते हैं। ध्यान रखें कि एक उदाहरण के लिए एक विधि को बाध्यकारी (उदाहरण के लिए, self.slotname लिखकर) वास्तव में हर बार एक नया बंद बनाता है (जैसा कि this प्रश्न में)।

इसलिए एक ही समस्या कर

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

... 

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

... 

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

के रूप में आप मूल lambda अपने प्रश्न में के साथ किया था होगा। समाधान एक विशेषता में बंदself.test_slot को स्टोर करना है, जैसा कि @rainer सुझाव देता है। यह आवश्यक है क्योंकि आपके कोड में 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)