2012-08-29 7 views
10

Gibt es eine Möglichkeit textChanged und editingFinished für QLineEdit zu kombinieren? Das Problem ist, dass editingFinished ausgegeben wird, auch wenn ich den Cursor nur ohne Änderungen von QLineEdit wegbewege. Ich möchte jedoch nur dann ein Signal ausgeben, wenn nach der Bearbeitung Änderungen vorgenommen wurden.PyQt4: Kombinieren Textchanged und editingFinished für QLineEdit

Ich kann mir vorstellen, nur irgendwo den aktuellen Text zu speichern, den eingegebenen Text damit zu vergleichen und etwas nur dann zu tun, wenn es anders ist. Aber ich frage mich, ob es eine Lösung gibt, die rein auf Signalverarbeitung basiert.

EDIT: Am Ende musste ich den aktuellen Text speichern und mit dem neuen Text vergleichen und nicht der vorgeschlagenen Lösung folgen. Ich erkannte, dass in meiner Anwendung "1.2345" und "1.23" der gleiche Text sein würde, aber ich muss trotzdem einige andere Werte aktualisieren und so weiter. Ich schätze die ausführliche Antwort und Kommentare von @Avaris und @ekhumoro sehr und werde sie akzeptieren, da sie das ursprünglich gemeldete Problem zu lösen scheint.

Antwort

9

bearbeiten

Für Capturing manuelle Änderungen:

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

Edit 2

Für alle Bearbeitungen Erfassung (programmatischen und Handbuch):

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

bearbeiten 3

Für vom Benutzer nur Textänderungen erfassen:

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

Ihre Lösung unvollständig zu sein scheint. Zum Beispiel wird das Signal ausgelöst, wenn das Kontextmenü des Linien-Editors geöffnet wird (also müssen Sie vielleicht das 'event.reason()' überprüfen). Außerdem wird das Signal * nicht ausgelöst, wenn Return/Enter gedrückt wird - daher ist eine gewisse Tastaturbedienung erforderlich. – ekhumoro

+1

@ekhumoro: Sie haben Recht mit diesen Fragen. Meine Antwort wurde aktualisiert. – Avaris

+0

Nicht schlecht - aber was ist, wenn z.B. 'setText()' oder 'clear()' wird zwischen den Bearbeitungen aufgerufen? – ekhumoro

5

Wenn Sie nur, ob erkennen sollen alle Änderungen vorgenommen wurden (im Gegensatz, ob der Text aus, wie es ist anders gestartet wird), können Sie die modified Eigenschaft des QLineEdit mit dem editingFinished Signal verwenden:

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)