Шаг 63.
Библиотека PyQt5. Обработка сигналов и событий. События клавиатуры. Назначение клавиш быстрого доступа

    На этом шаге мы рассмотрим различные способы назначения клавиш быстрого доступа.

    Клавиши быстрого доступа (иногда их также называют "горячими" клавишами) позволяют установить фокус ввода с помощью нажатия специальной клавиши (например, Alt или Ctrl) и какой-либо дополнительной клавиши. Если после нажатия клавиш быстрого доступа в фокусе окажется кнопка (или пункт меню), то она будет нажата.

    Чтобы задать клавиши быстрого доступа, следует в тексте надписи указать символ & перед буквой. В этом случае буква, перед которой указан символ &, будет, в качестве подсказки пользователю, подчеркнута. При одновременном нажатии клавиши Alt и подчеркнутой буквы компонент окажется в фокусе ввода. Некоторые компоненты - например, текстовое поле, - не имеют надписи. Чтобы задать клавиши быстрого доступа для таких компонентов, необходимо отдельно создать надпись и связать ее с компонентом с помощью метода setBuddy(<Компонент>) класса QLabel. Если же создание надписи не представляется возможным, то можно воспользоваться следующими методами класса QWidget:

    При нажатии клавиш быстрого доступа генерируется событие QEvent.Shortcut, которое можно обработать в методе event (self, <event>). Через параметр <event> доступен экземпляр класса QShortcutEvent, поддерживающий следующие методы:

    Создадим окно с надписью, двумя однострочными текстовыми полями и кнопкой. Для первого текстового поля назначим комбинацию клавиш Alt+B через надпись, а для второго поля - комбинацию Alt+E с помощью метода grabShortcut(). Для кнопки назначим комбинацию клавиш Alt+У обычным образом - через надпись на кнопке.

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class MyLineEdit(QtWidgets.QLineEdit):
    def __init__(self, parent = None):
        QtWidgets.QLineEdit.__init__(self, parent)
        self.id = None
    def event(self, e):
        if e.type() == QtCore.QEvent.Shortcut:
            if self.id == e.shortcutId():
                self.setFocus(QtCore.Qt.ShortcutFocusReason)
                return True
        return QtWidgets.QLineEdit.event(self, e)

class MyWindow(QtWidgets.QWidget):
    def __init__ (self, parent = None):
        QtWidgets.QWidget.__init__(self, parent)
        self.resize(300, 100)
        self.label = QtWidgets.QLabel("Устано&вить фокус на поле 1")
        self.lineEdit1 = QtWidgets.QLineEdit()
        self.label.setBuddy(self.lineEdit1)
        self.lineEdit2 = MyLineEdit()
        self.lineEdit2.id = self.lineEdit2.grabShortcut(
           QtGui.QKeySequence.mnemonic("&е"))
        self.button = QtWidgets.QPushButton("&Убрать фокус с поля 1")
        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.vbox.addWidget(self.lineEdit1)
        self.vbox.addWidget(self.lineEdit2)
        self.vbox.addWidget(self.button)
        self.setLayout(self.vbox)
        self.button.clicked.connect(self.on_clicked)
    def on_clicked(self):
        self.lineEdit1.clearFocus()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
Архив с файлом можно взять здесь.

    Результат работы приложения изображен на рисунке 1.


Рис.1. Результат работы приложения

    Помимо рассмотренных способов, для назначения клавиш быстрого доступа можно воспользоваться классом QShortcut из модуля QtWidgets. В этом случае назначение клавиш для второго текстового поля будет выглядеть так:

self.lineEdit2 = QtWidgets.QLineEdit ()
self.shc = QtWidgets.QShortcut (QtGui.QKeySequence.mnemonic("&е"), self)
self.shc.setContext (QtCore.Qt.WindowShortcut)
self.shc.activated.connect (self.lineEdit2.setFocus)

    Назначить комбинацию быстрых клавиш также позволяет класс QAction из модуля QtWidgets. Назначение клавиш для второго текстового поля выглядит следующим образом:

self.lineEdit2 = QtWidgets.QLineEdit()
self.act = QtWidgets.QAction(self)
self.act.setShortcut(QtGui.QKeySequence. mnemonic("&е"))
self.act.triggered.connect(self.lineEdit2.setFocus)
self.addAction(self.act)

    На следующем шаге мы рассмотрим нажатие и отпускание клавиши на клавиатуре.




Предыдущий шаг Содержание Следующий шаг