2017-07-28 7 views
1

これはおそらく重複している質問ですが、私はpyqtを新しくしたので、他の回答が私のケースで助けにならないので、質問する必要があります(数日前のtkinterから切り替えました)。私は疑問に思ってPyQt4ウィジェットへのkeyReleaseイベントの接続

は、それが>

self.lineEdit = QtGui.QLineEdit(self.frame) 

self.lineEdit.keyReleaseEvent(lambda: someFunction(QtCore.Qt.Key_A)) 

self.lineEdit.setObjectName(_fromUtf8("lineEdit")) 

self.horizontalLayout.addWidget(self.lineEdit) 

のようなウィジェットにイベントを接続することも可能であるし、その後...

def someFunction(event): 
    print(event) 
    ... 

私の質問は、ウィジェットに特定のイベントを結合し、そしてそれを接続する方法でありますイベントを関数で... like btn.clicked.connect(function_goes_here)

tkinterでそれは何かのようになります:

self.Entry.bind("<KeyRelease-a>", lambda event: someFunction(event)) 

簡単な作業例が可能

答えて

1

場合は、これを達成するために、いくつかの異なる方法がありますが、素晴らしいことです。 に与えられたウィジェットのすべてのイベントを聴くための汎用的な方法、それにinstall an event-filterにある:

また
class MainmWindow(QtGui.QMainWindow): 
    def __init__(self): 
     ... 
     self.lineEdit = QtGui.QLineEdit(self.frame) 
     self.lineEdit.installEventFilter(self) 

    def eventFilter(self, source, event): 
     if source is self.lineEdit: 
      if event.type() == QtCore.QEvent.KeyRelease: 
       print('key release:', event.key()) 
       # the following line will eat the key event 
       # return True 
     return super(MainmWindow, self).eventFilter(source, event) 

、あなたはサブクラスウィジェットは、関連するイベントハンドラを再実装、およびカスタムを発することができます信号:

class LineEdit(QtGui.QLineEdit): 
    keyReleased = QtCore.pyqtSignal(int) 

    def keyReleaseEvent(self, event): 
     self.keyReleased.emit(event.key()) 
     super(LineEdit, self).keyReleaseEvent(event) 

class MainmWindow(QtGui.QMainWindow): 
    def __init__(self): 
     ... 
     self.lineEdit = LineEdit(self.frame) 
     self.lineEdit.keyReleased.connect(self.handleKeyRelease) 

    def handleKeyRelease(self, key): 
     print('key release:' key) 

この詳細ハック変動が直接メソッドを上書きすることである。

class MainmWindow(QtGui.QMainWindow): 
    def __init__(self): 
     ... 
     self.lineEdit = QtGui.QLineEdit(self.frame) 
     self.lineEdit.keyReleaseEvent = self.handleKeyRelease 

    def handleKeyRelease(self, event): 
     print('key release:', event.key()) 
     QtGui.QLineEdit.keyReleaseEvent(self.lineEdit, event) 

なおデフォルトのイベント処理を呼び出さない場合は、ベースクラスメソッドの呼び出しを省略できます。

+0

私はこのハックな方法が好きです:D、もう1つの質問があります。このキーリリースイベントは 'Ctrl'と 'a'の2つのキーコードを返すので、 "Ctrl + a"などの2つのキーをバインドすることは可能ですか?または、この目的のために、 'keyRelase'の代わりに使用する別のイベントがあります。 –

+1

@DušanAtanacković。必要なのは、単純なif文で、好きなキーの組み合わせがあるかどうかを調べるだけです: 'event.modifiers()== QtCore.Qt.ControlModifierとevent.key()== QtCore.Qt.Key_A:'。 – ekhumoro

+0

私はこの質問は以前のものとは関係ないことを知っていますが、私はこの質問は私が現在開発しているプログラムと関連しているので、どのOSを使用しているのだろうと思っています。 Linux用のクイックインストーラですので、もしあなたがそのプロジェクトで面白いのであれば、ここで確認できます。https://github.com/Dusan92Atanackovic/luqi.git に関して –

関連する問題