Evgenii Legotckoi
Evgenii Legotckoi28 лютого 2016 р. 10:45

QGlobalShortcut - глобальні гарячі клавіші

У процесі вивчення питань із глобальними хоткеями для Linux та Windows я написав свій велосипед для швидкої реєстрації хоткеїв. бібліотека, що вийшла, називається QGlobalShortcut і викладена на GitHub під ліцензією LGPLv2. Бібліотека підтримує платформи Windows і Linux/Unix (які використовують X11)

Логіка роботи класу QGlobalShortcut, який надається цією бібліотекою, схожа на логіку роботи класу QShortcut, хоча явно не дотягує до даного класу за рядом параметрів, але головне, що виконує свою основну функцію. Зокрема, зареєструвати глобальний HotKey і надіслати сигнал про його активацію.

На даний момент для використання бібліотеки необхідно помістити заголовні файли та файли вихідних кодів у Ваш проект, а також прописати додаткову інформацію у профайлі проекту.


Отримати бібліотеку

Скачать QGlobalShortcut

Налаштування проекту

Бібліотека складається з одного заголовного файлу та двох файлів вихідних кодів залежно від платформи (Windows, X11). Крім README і т.д.

Бібліотека використовує стандарт мови C++11, тому необхідно конфігурувати проект на цей стандарт або вище. Для linux/unix необхідно використовувати модуль x11extras, який швидше за все необхідно встановити окремо, оскільки Qt за замовчуванням не має в поставці даного модуля. Також необхідно буде конфігурувати проект використання бібліотек для роботи з XLib і XCB.

CONFIG += c++11

linux {
    QT       += x11extras
    CONFIG   += link_pkgconfig
    PKGCONFIG += x11
}

win32: SOURCES += win/qglobalshortcut.cpp
linux: SOURCES += x11/qglobalshortcut.cpp

HEADERS  += qglobalshortcut.h

Громадські функції

ярлик QKeySequence()

Метод повертає встановлену послідовність поєднань гарячих клавіш QKeySequence. Якщо послідовність не встановлена, повертається порожня послідовність QKeySequence("").

bool isEmpty()

Метод перевіряє, чи встановлена послідовність гарячих клавіш чи ні.

bool isEnabled()

Метод перевіряє, включений хоткей чи ні. Поєднання гарячих клавіш може бути встановлене, тоді isEmpty() повертатиме true, але їх спрацювання може бути вимкнено. Тобто сигнал активації хоткею не генеруватиметься.

bool setShortcut(const QKeySequence &keySequence)

Метод є слотом та встановлює послідовність гарячих клавіш. При цьому, якщо QKeySequence містить кілька сполучень клавіш, всі вони будуть зареєстровані.

bool unsetShortcut()

Метод є слотом та видаляє поєднання гарячих клавіш, якщо воно було встановлено.

void setEnabled (увімкнено bool)

Метод є слотом і служить для включення та вимкнення активації поєднання гарячих клавіш.

Сигнали

void activated()

Сигнал активації хоткея, спрацьовує тоді, коли хоткей встановлений та включений.

Використання

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "qglobalshortcut.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void slotFirst();
    void slotSecond();

private:
    Ui::MainWindow *ui;
    QGlobalShortcut *shortcutFirst;
    QGlobalShortcut *shortcutSecond;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    shortcutFirst = new QGlobalShortcut(this);
    connect(shortcutFirst, &QGlobalShortcut::activated, this, &MainWindow::slotFirst);
    shortcutFirst->setShortcut(QKeySequence("Ctrl+E"));

    shortcutSecond = new QGlobalShortcut(this);
    connect(shortcutSecond, &QGlobalShortcut::activated, this, &MainWindow::slotSecond);
    shortcutSecond->setShortcut(QKeySequence("Ctrl+G"));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotFirst()
{
    qDebug() << "First";
}

void MainWindow::slotSecond()
{
    qDebug() << "Second";
}

Рекомендації до застосування

При створенні екземпляра класу QGlobalShortcut створюється nativeEventFilter, який встановлюється на весь додаток. При цьому кількість фільтрів у додатку не обмежена (тобто Ви можете створити будь-яку кількість глобальних хоткеїв за допомогою даного класу), але фільтр встановлений останнім спрацьовуватиме першим. При цьому використовувати цей клас можна в будь-якому місці програми.

При цьому важливо розуміти, що при використанні даного класу не можна бути точно впевненим, в якій саме послідовності будуть встановлені всі фільтри, що може впливати на продуктивність програми, в якій використовується перевірка інших подій операційної системи, а не глобальних гарячих клавіш. Тобто, якщо Ви вже використовуєте клас, успадкований від QAbstractNativeEventFilter, і встановили даний фільтр на додаток для обробки низки подій системи за допомогою нього, то, можливо, має сенс не використовувати бібліотеку в лоб, а застосувати частину програмного коду бібліотеки у Вашому вже існуючий клас.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
e
  • ehot
  • 31 березня 2024 р. 14:29

C++ - Тест 003. Условия и циклы

  • Результат:78бали,
  • Рейтинг балів2
B
  • Bogdannn
  • 27 березня 2024 р. 19:21

C++ - Тест 002. Константы

  • Результат:16бали,
  • Рейтинг балів-10
B
  • Bogdannn
  • 27 березня 2024 р. 19:15

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

  • Результат:46бали,
  • Рейтинг балів-6
Останні коментарі
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 10:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 08:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 грудня 2023 р. 21:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
a
a_vlasov14 квітня 2024 р. 06:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 02:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 04:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
P
Pisych27 лютого 2023 р. 04:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 січня 2024 р. 11:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

Слідкуйте за нами в соціальних мережах