web-dev-qa-db-ja.com

KeyPressEventに接続するPyQt

特定のウィジェットを使用すると、次のことが可能になります。

_self.widget.clicked.connect(on_click)
_

しかしやっている:

_self.widget.keyPressEvent.connect(on_key)
_

オブジェクトに属性 'connect'がないと言って失敗します。

ウィジェットをサブクラス化し、keyPressEventメソッドを再実装すると、イベントに応答できるようになることを知っています。しかし、ユーザーコンテキストから、その後のキーボードイベントに.connect()する、または別の言い方をするとどうすればよいでしょうか。

8
jpcgt

カスタムシグナルを作成し、再実装されたイベントハンドラーから発行します。

class MyWidget(QtGui.QWidget):
    keyPressed = QtCore.pyqtSignal(int)

    def keyPressEvent(self, event):
        super(MyWidget, self).keyPressEvent(event)
        self.keyPressed.emit(event.key())
...

def on_key(key):
    # test for a specific key
    if key == QtCore.Qt.Key_Return:
        print('return key pressed')
    else:
        print('key pressed: %i' % key)

self.widget.keyPressed.connect(on_key)

(注:既存のイベント処理を維持するには、基本クラスの実装を呼び出す必要があります)。

10
ekhumoro

私が過去にこれを行った方法は(これは回避策です)、これは送信者にあり、受信者は信号を宣言/接続します。

def keyPressEvent(self, event):
    if type(event) == QtGui.QKeyEvent:
        if event.key() == QtCore.Qt.Key_Space:
            self.emit(QtCore.SIGNAL('MYSIGNAL'))
4
chris