Evgenii Legotckoi
30 серпня 2015 р. 20:33

Qt/C++ - Урок 012. QShortcut – Як працювати з гарячими клавішами в Qt?

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

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up