2012-08-29 11 views
10

और editingFinishedQLineEdit के लिए गठबंधन करने का कोई तरीका है? समस्या यह है कि editingFinished उत्सर्जित होता है भले ही मैं केवल कर्सर को QLineEdit से बिना किसी बदलाव के स्थानांतरित कर दूं। जबकि मैं केवल एक सिग्नल उत्सर्जित करना चाहता हूं जब संपादन समाप्त होने के बाद कोई भी परिवर्तन किया गया।PyQt4: टेक्स्ट गठबंधन करें और संपादित करें QLineEdit

मैं कल्पना कर सकता हूं कि केवल वर्तमान पाठ को स्टोर करने के लिए, इसके साथ दर्ज किए गए टेक्स्ट की तुलना करें और केवल तभी कुछ करें जब यह अलग हो। लेकिन मुझे आश्चर्य है कि सिग्नल हैंडलिंग पर आधारित कोई समाधान है या नहीं।

संपादित करें: अंत में मुझे वर्तमान पाठ को स्टोर करना था और नए पाठ की तुलना करना था और प्रस्तावित समाधान का पालन नहीं करना था। मुझे एहसास हुआ कि मेरे आवेदन में "1.2345" और "1.23" एक ही पाठ होगा लेकिन फिर भी मुझे इस मामले में कुछ अन्य मूल्यों को अपडेट करना होगा और इसी तरह। मैं वास्तव में @Avaris और @ekhumoro द्वारा विस्तृत उत्तर और टिप्पणियों की सराहना करता हूं, और मूल रूप से पोस्ट की गई समस्या को हल करने के बाद से इसे स्वीकार करूँगा।

उत्तर

9

संपादित

कब्जा मैन्युअल संपादन के लिए:

class MyLineEdit(QtGui.QLineEdit): 
    textModified = QtCore.pyqtSignal(str, str) # (before, after) 

    def __init__(self, contents='', parent=None): 
     super(MyLineEdit, self).__init__(contents, parent) 
     self.returnPressed.connect(self.checkText) 
     self._before = contents 

    def focusInEvent(self, event): 
     if event.reason() != QtCore.Qt.PopupFocusReason: 
      self._before = self.text() 
     super(MyLineEdit, self).focusInEvent(event) 

    def focusOutEvent(self, event): 
     if event.reason() != QtCore.Qt.PopupFocusReason: 
      self.checkText() 
     super(MyLineEdit, self).focusOutEvent(event) 

    def checkText(self): 
     if self._before != self.text(): 
      self._before = self.text() 
      self.textModified.emit(self._before, self.text()) 

संपादित 2

सभी संपादन पर कब्जा (कार्यक्रम संबंधी और मैनुअल) के लिए:

class MyLineEdit(QtGui.QLineEdit): 
    textModified = QtCore.pyqtSignal(str, str) # (before, after) 

    def __init__(self, contents='', parent=None): 
     super(MyLineEdit, self).__init__(contents, parent) 
     self.editingFinished.connect(self.checkText) 
     self.textChanged.connect(lambda: self.checkText()) 
     self.returnPressed.connect(lambda: self.checkText(True)) 
     self._before = contents 

    def checkText(self, _return=False): 
     if (not self.hasFocus() or _return) and self._before != self.text(): 
      self._before = self.text() 
      self.textModified.emit(self._before, self.text()) 

संपादित 3

उपयोगकर्ता से केवल पाठ परिवर्तन पर कब्जा करने के लिए:

class MyLineEdit(QtGui.QLineEdit): 
    textModified = QtCore.pyqtSignal(str, str) # (before, after) 

    def __init__(self, contents='', parent=None): 
     super(MyLineEdit, self).__init__(contents, parent) 
     self.editingFinished.connect(self.__handleEditingFinished) 
     self.textChanged.connect(self.__handleTextChanged) 
     self._before = contents 

    def __handleTextChanged(self, text): 
     if not self.hasFocus(): 
      self._before = text 

    def __handleEditingFinished(self): 
     before, after = self._before, self.text() 
     if before != after: 
      self._before = after 
      self.textModified.emit(before, after) 
+0

आपका समाधान अपूर्ण लगता है। उदाहरण के लिए, अगर लाइन-एडिट का संदर्भ मेनू खोला जाता है तो संकेत सिग्नल हो जाएगा (इसलिए शायद आपको 'event.reason() ') की जांच करनी होगी। इसके अलावा, सिग्नल * वापस नहीं होगा * अगर वापसी/एंटर दबाया जाता है - तो कुछ कीबोर्ड हैंडलिंग की आवश्यकता होती है। – ekhumoro

+1

@ekhumoro: आप उन मुद्दों के बारे में सही हैं। मेरा जवाब अपडेट किया गया। – Avaris

+0

बुरा नहीं - लेकिन क्या होगा यदि उदा। 'setText() 'या' clear() 'संपादन के बीच कहा जाता है? – ekhumoro

5

तुम सिर्फ पता लगाने के लिए कि क्या किसी भी परिवर्तन करने के पश्चात (के रूप में है कि क्या पाठ से यह कैसे अलग है करने का विरोध किया चाहते हैं) शुरू कर दिया है, तो आप editingFinished संकेत के साथ QLineEdit की modified संपत्ति का उपयोग कर सकते हैं:

self.edit = QtGui.QLineEdit(self) 
    self.edit.editingFinished.connect(self.handleEditingFinished) 
    ... 

def handleEditingFinished(self): 
    if self.edit.isModified(): 
     # do interesting stuff ... 
     print 'Editing Finished' 
    self.edit.setModified(False) 
संबंधित मुद्दे