2012-08-29 18 views
10

için textChanged ve editingFinished'u birleştirmenin bir yolu var mı? Sorun, imleci hiçbir değişiklik yapmadan sadece QLineEdit'dan uzak tuttuğum halde editingFinished'un gönderilmesidir. Ancak, düzenlemeyi bitirdikten sonra herhangi bir değişiklik yapıldığında sadece bir sinyal vermek istiyorum.PyQt4: metni birleştirChanged ve editingFile için QLineEdit

Sadece mevcut metnin bir kısmını depolayabildiğimi, girilen metni onunla karşılaştırıp sadece farklıysa bir şeyler yapabileceğini hayal edebiliyorum. Ama sadece sinyal işlemeye dayanan bir çözüm olup olmadığını merak ediyorum.

DÜZENLEME: Sonunda mevcut metni saklamak ve yeni metinle karşılaştırmak zorunda kaldım ve önerilen çözümü izlemem gerekiyordu. Uygulamamda "1.2345" ve "1.23" kelimelerinin aynı metin olacağını ancak bununla birlikte diğer bazı değerleri güncellemem gerektiğini fark ettim. @Avaris ve @ekhumoro'nun detaylı cevabını ve yorumlarını gerçekten takdir ediyorum ve orijinal olarak gönderilen sorunu çözdüğü için kabul edeceğim.

cevap

9

Düzenleme

yakalayan manuel düzenlemeler için: (programlı ve manuel) tüm düzenlemeleri çekmek içindir

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()) 

Düzenleme 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()) 

kullanıcı tarafından yalnızca metin değişiklikleri yakalayan İçin Düzenleme 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

Çözümünüz tamamlanmamış görünüyor. Örneğin, line-edit'in içerik menüsü açıldığında sinyal yanacaktır (bu yüzden belki de 'event.reason() 'kontrol etmelisiniz). Ayrıca, dönüş/girişe basıldığında sinyal * yanmaz * - bu nedenle bazı klavye kullanımı gereklidir. – ekhumoro

+1

@ekhumoro: Bu konular hakkında haklısınız. Cevabımı güncelledi. – Avaris

+0

Fena değil - ama eğer öyleyse 'setText()' veya 'clear()' düzenleme arasında mı çağrılır? – ekhumoro

5

sadece metin nasıl farklı olup olmadığını aksine herhangi değişiklikleri (yapılmıştır olmadığını saptamak istiyorsanız) başladı, sen editingFinished sinyalli QLineEdit ait modified özelliğini kullanabilirsiniz:

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)