Даже в официальной документации на тему QShortcut написано не так много, поэтому это скорее заметка, чтобы не забыть, а не полноценная статья. Всего лишь несколько слов о том, как подключить объект QShortcut, который будет отвечать за обработку нажатия горячей клавиши или сочетания горячих клавиш, например Ctrl + D .
Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.
Структура проекта для QShortcut
Структура проекта настолько тривиальна, что я даже не буду приводить её в данной заметке. Ограничусь лишь теми словами, что мы будем работать с двумя файлами:
- mainwindow.h
- mainwindow.cpp
А файл mainwindow.ui даже трогать в этом проекте не будем. Как он будет создан по умолчанию, так его и оставим.
mainwindow.h
В заголовочном файле потребуется объявить два объекта QShortcut , а также методы для обработки нажатий горячих клавиш.
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include <QShortcut>
- #include <QMessageBox>
- namespace Ui {
- class MainWindow;
- }
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- private slots:
- // слоты для обработки нажатий горячих клавиш
- void slotShortcutF11();
- void slotShortcutCtrlD();
- private:
- Ui::MainWindow *ui;
- QShortcut *keyF11; // объект горячей клавиши F11
- QShortcut *keyCtrlD; // объект сочетания клавиш Ctrl + D
- };
- #endif // MAINWINDOW_H
mainwindow.cpp
Минимальная настройка горячей клавиши заключается:
- в инициализации объекта, который будет отвечать за горячую клавишу или сочетание горячих клавиш;
- передаче кодов горячих клавиш в объект;
- подключении СЛОТа-обработчика нажатий горячих клавиш к объекту QShortcut .
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- keyF11 = new QShortcut(this); // Инициализируем объект
- keyF11->setKey(Qt::Key_F11); // Устанавливаем код клавиши
- // цепляем обработчик нажатия клавиши
- connect(keyF11, SIGNAL(activated()), this, SLOT(slotShortcutF11()));
- keyCtrlD = new QShortcut(this); // Инициализируем объект
- keyCtrlD->setKey(Qt::CTRL + Qt::Key_D); // Устанавливаем сочетание клавиш
- // подключаем обработчик нажатия клавиши
- connect(keyCtrlD, SIGNAL(activated()), this, SLOT(slotShortcutCtrlD()));
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- /* Слот для обработки нажатия клавиши F11
- * */
- void MainWindow::slotShortcutF11()
- {
- /* В этом обработчике сделаем переключение приложения
- * в полноэкранный режим и обратно в нормальный режим окна
- * */
- if(this->isFullScreen()){
- this->showNormal();
- } else {
- this->showFullScreen();
- }
- }
- /* Слот для обработки сочетания клавиш Ctrl + D
- * */
- void MainWindow::slotShortcutCtrlD()
- {
- /* Для обработки сочетания клавив Ctrl + D
- * сделаем информационный MessageBox,
- * который будет сигнализировать о том, что было нажато данное
- * сочетание клавиш
- * */
- QMessageBox::information(this,
- "Горячая клавиша",
- "Мои поздравления!!! Горячая клавиша работает",
- QMessageBox::Ok);
- }
Итог
В данном примере показан один из способов задания сочетания горячих клавиш, тогда как официальная документация приводит примеры нескольких способов:
- setKey(0); // сигнал не вызывается
- setKey(QKeySequence()); // сигнал не вызывается
- setKey(0x3b1); // Указание кода клавиши
- setKey(Qt::Key_D); // 'd', указание кода клавиши через директиву define
- setKey('q'); // 'q', указание кода клавиши через символ
- setKey(Qt::CTRL + Qt::Key_P); // Ctrl+P, указание сочетания клавиш через директивы define
- setKey("Ctrl+P"); // Ctrl+P, прямое написание сочетания клавиш
- /* Сочетания клавиш необходимо прописывать через знак "+" */
В результате у Вас должно получиться приложение, которое по нажатию клавиши F11 разворачивается в полноэкранный режим и сворачивается обратно в нормальное отображение окна, а также по нажатию сочетания клавиш Ctrl + D вызывает MessageBox , который сигнализирует о нажатии этого сочетания клавиш.
Приложение с применением QShortcut