Реклама

Qt/C++ - Урок 012. QShortcut или Горячие клавиши в Qt

РуководствоQtQShortcut, QShortcut example, Qt2404

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

Комментарии

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
Последние комментарии
  • EVILEG
  • 13 июля 2017 г. 2:12

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Ну например так можете сделать.void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ if (QApplication::mouseButtons() == Qt::RightButton) { this->deleteLa...

  • Mark
  • 13 июля 2017 г. 1:26

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Подскажите пожалуйста как в данном проекте по перетаскиванию организовать удаление объекта со scene методом delete item, допустим при щелчке ПКМ по объекту QGraphicsScene. Мои попытки оказалис...

  • EVILEG
  • 10 июля 2017 г. 21:34

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

А что делали? Повторяете урок или как? Пытались просто скачать проект в конце статьи и запустить?

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

У меня происходит переполнение счетчика count, появляется ошибка malloc(): memory corruption (fast). Не подскажите, как с этим бороться?

  • EVILEG
  • 9 июля 2017 г. 2:07

GameDev на Qt - Урок 3. Уничтожение противников

Поэтому в пятом уроке есть исходники всего проекта )))). Вообще, все эти материалы были не предыдущей версии сайта, которая на WordPress. Во время переноса мог что-то потерять.

Сейчас обсуждают на форуме

тестирование классов в QT

это вопрос.

Как реализовать отправку e-mail

Возможно что уже и нет необходимости в почтовом клиенте, но в своё время так же столкнулся с данной проблемой в QT. Нашел один интересный проект под названием libqxt, там реализовано дов...

  • Asteri
  • 14 июля 2017 г. 12:23

css

Делюсь, может, пригодится когда-нибудь) QTableView QHeaderView { background-color: #ffffff; } Вот так эта проблема лечится, градиент задать не получается, но хоть...

  • EVILEG
  • 12 июля 2017 г. 19:52

QSqlQuery выполнение sql запросов из файла

Мне думается, что это уже будет дело вкуса и вашего взгляда на проект. Если Вы действительно собираетесь просто скармливать своему софту SQL скрипты, которые должны будут выполняться для...

QML Canvas + Line. Bug?

Вот оно что, значит не баг) Спасибо