PyQt подключение к KeyPressEvent

некоторые виджеты позволят мне делать:

self.widget.clicked.connect(on_click)

но делать:

self.widget.keyPressEvent.connect(on_key)

не удастся сказать, что объект не имеет атрибута "connect".

Я знаю, что подкласс виджета и повторная реализация keyPressEvent метод позволит мне ответить на событие. Но как я могу!--3--> к событию клавиатуры после этого, или иначе сказал, из контекста пользователя?

2 ответов


создайте пользовательский сигнал и выдайте его из обработчика событий reimplemented:

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)

(NB: вызов реализации базового класса необходим для сохранения существующей обработки событий).


способ, которым я сделал это в прошлом (это работа), где это находится в отправителе, а приемник объявляет/подключается к сигналу.

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