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
AD

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

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

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

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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