2014-12-15 5 views
5

Некоторые виджеты позволят мне сделать:PyQt Подключение к KeyPressEvent

self.widget.clicked.connect(on_click) 

но делать:

self.widget.keyPressEvent.connect(on_key) 

не сможет сказать, что объект не имеет атрибута 'подключения'.

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

+0

Исправьте меня, если я ошибаюсь, но keyPressEvent не является слотом, поэтому его нельзя подключить. Вы должны обрабатывать его с помощью любого из обработчиков событий. –

ответ

8

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

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

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

self.widget.keyPressed.connect(on_key) 

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

+1

Вам не нужно переоценивать '__init__' и вызывать супер' __init__'? – wesanyer

+0

@ wesanyer. Нет. Python всегда автоматически вызывает '__init__' для каждого базового класса, независимо от того, было ли оно переопределено или нет. Но, конечно, если вы ** сделаете ** переопределить '__init__', вам также придется явно вызвать реализацию базового класса (потому что он больше не будет вызываться автоматически). – ekhumoro

+0

Ах, спасибо, сэр. – wesanyer

3

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

def keyPressEvent(self, event): 
    if type(event) == QtGui.QKeyEvent: 
     if event.key() == QtCore.Qt.Key_Space: 
      self.emit(QtCore.SIGNAL('MYSIGNAL')) 
Смежные вопросы