Даже в официальной документации на тему 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