На этом шаге мы рассмотрим реализацию такого перехвата.
На предыдущих шагах мы рассмотрели обработку сигналов, которые позволяют обмениваться сообщениями между компонентами. Обработка внешних событий - например, нажатий клавиш, - осуществляется несколько иначе. Чтобы обработать событие, необходимо наследовать класс и переопределить в нем метод со специальным названием, - так, чтобы обработать нажатие клавиши, следует переопределить метод keyPressEvent(). Специальные методы принимают объект, содержащий детальную информацию о событии, - например, код нажатой клавиши. Все эти объекты являются наследниками класса QEvent и наследуют следующие методы:
Статический метод registerEventType ([<Число>]) позволяет зарегистрировать пользовательский тип события, возвращая идентификатор зарегистрированного события. В качестве параметра можно указать значение в пределах от QEvent.User(1000) до QEvent.MaxUser(65535).
Перехват всех событий осуществляется с помощью метода с предопределенным названием event(self, <event>). Через параметр <event> доступен объект с дополнительной информацией о событии. Этот объект отличается для разных типов событий - например, для события MouseButtonPress объект будет экземпляром класса QMouseEvent, а для события KeyPress - экземпляром класса QKeyEvent. Методы, поддерживаемые всеми этими классами, мы рассмотрим в следующих шагах.
Из метода event() следует вернуть в качестве результата значение True, если событие было обработано, и False - в противном случае. Если возвращается значение True, то родительский компонент не получит событие. Чтобы продолжить распространение события, необходимо вызвать метод event() базового класса и передать ему текущий объект события. Обычно это делается так:
return QtWidgets.QWidget.event(self, e)
В этом случае пользовательский класс является наследником класса QWidget и переопределяет метод event(). Если вы наследуете другой класс, то следует вызывать метод именно этого класса. Например, при наследовании класса QLabel инструкция будет выглядеть так:
return QtWidgets.QLabel.event(self, e)
Пример перехвата нажатия клавиши, щелчка мышью и закрытия окна показан в примере ниже.
# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtWidgets import time class MyWindow(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.resize(300, 100) def event(self, e): if e.type() == QtCore.QEvent.KeyPress: print("Нажата клавиша на клавиатуре") print("Код:", e.key(), ", текст:", e.text()) elif e.type() == QtCore.QEvent.Close: print("Окно закрыто") elif e.type() == QtCore.QEvent.MouseButtonPress: print ("Щелчок мышью. Координаты:", e.x(), e.y()) return QtWidgets.QWidget.event(self, e) # Отправляем дальше if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
Результат работы приложения изображен на рисунке 1.
Рис.1. Результат работы приложения
Со следующего шага мы начнем рассматривать события окна.