На этом шаге мы рассмотрим различные способы назначения клавиш быстрого доступа.
Клавиши быстрого доступа (иногда их также называют "горячими" клавишами) позволяют установить фокус ввода с помощью нажатия специальной клавиши (например, Alt или Ctrl) и какой-либо дополнительной клавиши. Если после нажатия клавиш быстрого доступа в фокусе окажется кнопка (или пункт меню), то она будет нажата.
Чтобы задать клавиши быстрого доступа, следует в тексте надписи указать символ & перед буквой. В этом случае буква, перед которой указан символ &, будет, в качестве подсказки пользователю, подчеркнута. При одновременном нажатии клавиши Alt и подчеркнутой буквы компонент окажется в фокусе ввода. Некоторые компоненты - например, текстовое поле, - не имеют надписи. Чтобы задать клавиши быстрого доступа для таких компонентов, необходимо отдельно создать надпись и связать ее с компонентом с помощью метода setBuddy(<Компонент>) класса QLabel. Если же создание надписи не представляется возможным, то можно воспользоваться следующими методами класса QWidget:
QtGui.QKeySequence.mnemonic("&е") QtGui.QKeySequence("Alt+е") QtGui.QKeySequence(QtCore.Qt.ALT + QtCore.Qt.Key_Е)
В параметре <Контекст> можно указать атрибуты WidgetShortcut, WidgetWithChildrenShortcut, WindowShortcut (значение по умолчанию) и ApplicationShortcut класса QtCore.Qt;
При нажатии клавиш быстрого доступа генерируется событие 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)
На следующем шаге мы рассмотрим нажатие и отпускание клавиши на клавиатуре.