Während ich Probleme mit globalen Hotkeys für Linux und Windows untersuchte, schrieb ich mein Fahrrad für die schnelle Registrierung von Hotkeys. Die resultierende Bibliothek heißt QGlobalShortcut und ist auf GitHub unter LGPLv2-Lizenz verfügbar. Die Bibliothek unterstützt Windows - und Linux/Unix -Plattformen (die X11 verwenden).
Die Logik der von dieser Bibliothek bereitgestellten Klasse QGlobalShortcut, ähnelt der Logik der Klasse QShortcut, obwohl sie diese Klasse offensichtlich in einigen Parametern nicht erreicht, aber die Hauptsache ist, dass sie ihre Hauptfunktion erfüllt . Registrieren Sie nämlich den globalen HotKey und senden Sie ein Signal über seine Aktivierung.
Um die Bibliothek zu verwenden, müssen Sie derzeit die Header-Dateien und Quellcodedateien in Ihrem Projekt platzieren sowie zusätzliche Informationen zum Projektprofil hinzufügen.
Holen Sie sich die Bibliothek
Projektaufbau
Die Bibliothek besteht je nach Plattform (Windows, X11) aus einer Header-Datei und zwei Quellcode-Dateien. Abgesehen von README etc.
Die Bibliothek verwendet den Sprachstandard C++11, daher ist es zwingend erforderlich, das Projekt nach diesem Standard oder höher zu konfigurieren. Für Linux/Unix müssen Sie das Modul x11extras verwenden, das höchstwahrscheinlich separat installiert werden muss, da Qt dieses Modul nicht standardmäßig ausliefert. Außerdem müssen Sie das Projekt konfigurieren, um Bibliotheken für die Arbeit mit XLib und XCB zu verwenden.
CONFIG += c++11 linux { QT += x11extras CONFIG += link_pkgconfig PKGCONFIG += x11 } win32: SOURCES += win/qglobalshortcut.cpp linux: SOURCES += x11/qglobalshortcut.cpp HEADERS += qglobalshortcut.h
Öffentliche Funktionen
QKeySequence-Verknüpfung ()
Die Methode gibt die festgelegte Hotkey-Kombinationssequenz QKeySequence zurück. Wenn die Sequenz nicht festgelegt ist, wird eine leere Sequenz QKeySequence("") zurückgegeben.
bool isEmpty()
Die Methode prüft, ob die Hotkey-Sequenz gesetzt ist oder nicht.
bool isEnabled()
Die Methode prüft, ob der Hotkey aktiviert ist oder nicht. Hotkey-Kombinationen können eingestellt werden, in diesem Fall gibt isEmpty() true zurück, aber sie können deaktiviert werden. Das heißt, das Hotkey-Aktivierungssignal wird nicht erzeugt.
bool setShortcut(const QKeySequence &keySequence)
Die Methode ist ein Slot und legt die Hotkey-Sequenz fest. Wenn in diesem Fall QKeySequence mehrere Tastenkombinationen enthält, werden sie alle registriert.
bool unsetShortcut()
Die Methode ist ein Slot und entfernt die Hotkey-Kombination, falls eine gesetzt wurde.
void setEnabled (bool aktivieren)
Die Methode ist ein Slot und wird verwendet, um die Aktivierung einer Hotkey-Kombination zu aktivieren und zu deaktivieren.
Signale
ungültig aktiviert ()
Hotkey-Aktivierungssignal, ausgelöst, wenn der Hotkey installiert und aktiviert ist.
Verwendung
#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"; }
Anwendungsempfehlungen
Wenn eine Instanz der Klasse QGlobalShortcut erstellt wird, wird nativeEventFilter erstellt und in der gesamten Anwendung installiert. Gleichzeitig ist die Anzahl der Filter in der Anwendung nicht begrenzt (das heißt, Sie können mit dieser Klasse eine beliebige Anzahl globaler Hotkeys erstellen), aber der zuletzt eingestellte Filter funktioniert zuerst. In diesem Fall können Sie diese Klasse überall in der Anwendung verwenden.
Gleichzeitig ist es wichtig zu verstehen, dass man bei Verwendung dieser Klasse nicht genau wissen kann, in welcher Reihenfolge alle Filter gesetzt werden, was die Leistung einer Anwendung beeinträchtigen kann, die die Überprüfung auf andere Betriebssystemereignisse verwendet, und nicht nur globale Hotkeys. Das heißt, wenn Sie bereits eine von QAbstractNativeEventFilter geerbte Klasse verwenden und diesen Filter auf der Anwendung installiert haben, um eine Reihe von Systemereignissen damit zu verarbeiten, kann es sinnvoll sein, die Bibliothek nicht direkt zu verwenden, sondern einen Teil davon anzuwenden des Bibliothekscodes in Ihrer bereits bestehenden Klasse.