Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
PyQt5, обработка нажатия клавиш, события keyPressEvent и keyReleaseEvent
Следует отметить, что минимальная обработка нажатия клавиш и так имеется. Мы просто не ставили акценты на этом
Но обо всём по порядку:
- Имеется простое окно, как в этой статье. Мы можем закрыть окно с помощью Alt+F4. И это значит, что по умолчанию класс QWidget обрабатывает клавиши, в частности данное сочетание клавиш.
- В другой статье мы рассматривали окно с кнопкой выхода. Обратите внимание, что клавиша Tab выделяет кнопку, точнее устанавливает на ней фокус. А если в окне несколько элементов, то с помощью клавиши Tab мы переводим фокус с одного элемента на другой. И значит по умолчанию обрабатывается ещё одна клавиша. Но это еще не всё. Если фокус на кнопке, то кнопка "нажимается" клавишей Пробел или Enter. И вот тут заметим один важный момент. Если нажатие обрабатывается сигналом QPushButton.clicked, то нажатие Пробел или Enter приводит к обработке нажатия кнопки. А если нажатие обрабатывается перегрузкой события QPushButton.mousePressEvent(), то нажатие, хоть и видно на экране, но само событие не срабатывает (см. программы статьи). Можно нажать кнопку только мышью, что вполне логично.
- В следующей статье мы рассматривали элемент QLineEdit. Это поле ввода. И поскольку мы можем вводить туда текст (если фокус на элементе), это означает, что в классе этого элемента заложена такая обработка клавиш.
- В следующей статье мы рассматривали элемента QComboBox, выпадающий список. Если фокус на этом элементе, то с помощью Enter или Пробел мы можем активизировать список, а затем с помощью клавиш Стрелка_вверх и Стрелка_вниз переходить от одного элемента к другому. Значит и здесь есть обработка клавиш по умолчанию.
- Далее у нас был элемент QSlider. И мы также могли передвигать планку слайдера с помощью клавиатуры. Хотя и медленно в связи с масштабом охвата.
Для чего это я всё перечислил? Только лишь для того, что обработка клавиш и так имеется и мы может этим пользоваться. Во многих случаях никакой дополнительной обработки не требуется. А вот если вы хотите разобраться с тем, как мы можем писать свои обработчики клавиатуры, то это будет ниже в статье.
Программа ниже создаёт окно с элементом QLineEdit (см. Рисунок 1). С помощью обработки нажатия клавиш мы делаем поле ввода доступной только для цифр, со всеми остальными возможностями полей ввода. Кроме того при нажатии клавиши Enter у введённой строки удаляются все крайние нулю слева. Кроме того путём перехвата клавиш, мы запрещаем выход из программы путём нажатия Alt+F4. Обычный выход путём нажатия кнопки КРЕСТИК в правом верхнем углу окна остаётся.
Пояснения к программе.
- Рассмотрим в начале обработку клавиатуры в классе поля редактирования led. key = event.key() - получить код нажатой клавиши. Далее проверяется, что код соответствует нашим замыслам, т.е. цифра, клавиши редактирования, клавиши передвижения по строке. Если так, то они обрабатываются стандартным способом: super().keyPressEvent(event). Отдельно обрабатывается клавиша Enter: key == Qt.Key_Return: self.setText(str(int(self.text()))). Т.е. удаляем левые нули. А потом опять super().keyPressEvent(event). А все остальные нажатия мы отправляем обрабатывать в обработчик окна: self.wg.keyPressEvent(event).
- Я видел в Интернет несколько способов обработки нажатия клавиш Alt+F4. Мне нравится мой подход. Обрабатывается нажатие и отпускание Alt (переменная alt), т.е. события keyPressEvent() и keyReleaseEvent(). При закрытии окна вызывается событие closeEvent(). Проверяется, если Alt нажата, то методом event.ignore() мы аннулируем событие. Да, скажите вы, но тогда при нажатой Alt и кнопка КРЕСТИК в правом верхнем углу не сработает. Да не сработает. Издержки метода. :)
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.