Навіть в офіційній документації на тему 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