2012-08-29 19 views
10

textChangededitingFinishedQLineEditに結合する方法はありますか?問題は、QLineEditから何も変更せずにカーソルを移動するだけでも、editingFinishedが放出されることです。一方、私は編集を終えた後に何らかの変更が行われたときにだけ信号を出したいと思っています。PyQt4:QLineEditにtextChangedとeditingFinishedを組み合わせる

私は、現在のテキストのどこかに格納し、入力したテキストと比較して、それが異なる場合にのみ何かを行うことしか想像できません。しかし、純粋に信号処理に基づいた解決策があるのだろうかと思います。

EDIT:最後に、現在のテキストを保存して新しいテキストと比較し、提案された解決策に従わなくてはなりませんでした。私のアプリケーションでは、 "1.2345"と "1.23"は同じテキストになりますが、この場合でも他の値を更新する必要があることに気付きました。私は@Avarisと@ekhumoroの詳細な回答とコメントを本当に感謝しており、元々投稿された問題を解決するように思われるので、それを受け入れます。すべての編集(プログラム及びマニュアル)を捕捉するための

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

:手動で編集を捕捉するため

答えて

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.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

:)を開始、あなたはeditingFinished信号とQLineEditmodifiedプロパティを使用することができます。例えば、行編集のコンテキストメニューが開かれているとシグナルが発せられます(おそらく 'event.reason()'をチェックする必要があります)。また、return/enterを押すとシグナル*は発火しないので、キーボードの処理が必要になります。 – ekhumoro

+1

@ echumoro:あなたはその問題について正しいです。私の答えを更新しました。 – Avaris

+0

悪くないですが、たとえば? 'setText()'または 'clear()'は編集の間に呼び出されますか? – ekhumoro

5

あなただけのテキストはどのように異なるかどうかとは対照的に、いかなる変更が(行われているかどうかを検出したい場合あなたのソリューションは不完全なようだ

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) 
関連する問題