Евгений Легоцкой30 августа 2015 г. 10: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
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
СП

C++ - Тест 001. Первая программа и типы данных

  • Результат:93баллов,
  • Очки рейтинга8
VS

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:30баллов,
  • Очки рейтинга-10
J

C++ - Тест 001. Первая программа и типы данных

  • Результат:93баллов,
  • Очки рейтинга8
Последние комментарии

Qt/C++ - Урок 074. Генерация псевдослучайных чисел с использованием случайной библиотеки STD

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.

Qt/C++ - Урок 074. Генерация псевдослучайных чисел с использованием случайной библиотеки STD

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.
S

QML - Урок 026. Intents с Qt для Android, часть 1

Есть ли возможность приведения java типа у QAndroidJniObject? Интересует конкретно class to
ВК

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Кто-нибудь знает, как сделать так, чтобы в QTableWidget состоящей из чекбоксов в строке таблицы можно было выбрать только один checkbox ?

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

QSqlTableModel выполняет ряд стандартных операций для одной таблицы из базы данных. Поэтому там и реализован функционал по удалению и редактированию. QSqlQueryModel позволяет выполнить запр…
Сейчас обсуждают на форуме
  • Nomad
  • 1 октября 2020 г. 5:22

MyForm(forms.Form): - непонятка

понятно спасибо
S

QWebView android

На android не запускается, иначе я бы не создавал этот пост. Собственно, вопрос я решил сам, там ещё понадобилось setDomStorageEnabled(true) вызвать.

не могу передать стринг с QLineEdit

QLineEdit *myLineEdit = new QLineEdit("line edit name", this); QString str = myLineEdit->text();

Siganal slot в ui

Добрый день, Не совсем понял, какой код должен находиться в слоте, но можно подключиться через лямбда функцию. connect(timer, &QTimer::timeout, this, [](){ ui->scrollArea-&g;…
VB

Лишние строки при выборке из базы данных SQLite

Ну вообще совсем без знания документации трудно что-либо написать. Я просмотрел видеокурс по моделям в Qt, несколько видеоуроков. Немного почитал документацию. Понятно, что где-то не понятно как…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB