特定のウィジェットを使用すると、次のことが可能になります。
_self.widget.clicked.connect(on_click)
_
しかしやっている:
_self.widget.keyPressEvent.connect(on_key)
_
オブジェクトに属性 'connect'がないと言って失敗します。
ウィジェットをサブクラス化し、keyPressEvent
メソッドを再実装すると、イベントに応答できるようになることを知っています。しかし、ユーザーコンテキストから、その後のキーボードイベントに.connect()
する、または別の言い方をするとどうすればよいでしょうか。
カスタムシグナルを作成し、再実装されたイベントハンドラーから発行します。
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)
(注:既存のイベント処理を維持するには、基本クラスの実装を呼び出す必要があります)。
私が過去にこれを行った方法は(これは回避策です)、これは送信者にあり、受信者は信号を宣言/接続します。
def keyPressEvent(self, event):
if type(event) == QtGui.QKeyEvent:
if event.key() == QtCore.Qt.Key_Space:
self.emit(QtCore.SIGNAL('MYSIGNAL'))