Qt QML中的全局快捷方式
我试图在QML(qt5.5)中创建一个应用程序,该应用程序总是在运行,并在用户按下Qt QML中的全局快捷方式,qt,qml,keyboard-shortcuts,qt5,qt5.5,Qt,Qml,Keyboard Shortcuts,Qt5,Qt5.5,我试图在QML(qt5.5)中创建一个应用程序,该应用程序总是在运行,并在用户按下alt+space时显示 我曾尝试在QML中使用Action类,但它仅在窗口具有焦点时有效,而在窗口不可见时无效 我也尝试过QShortcut(这并不理想,因为我的应用程序不是基于QWidget的),但没有结果 当窗口不可见时,在QApplication上使用eventFilter似乎也不起作用 有办法吗?我从来没有在QML中实现过应用程序,但我认为您需要的是全局快捷方式模块()。 这是一个“即使应用程序未处于活动
alt+space
时显示
我曾尝试在QML中使用Action
类,但它仅在窗口具有焦点时有效,而在窗口不可见时无效
我也尝试过QShortcut(这并不理想,因为我的应用程序不是基于QWidget的),但没有结果
当窗口不可见时,在QApplication
上使用eventFilter
似乎也不起作用
有办法吗?我从来没有在QML中实现过应用程序,但我认为您需要的是全局快捷方式模块()。
这是一个“即使应用程序未处于活动状态,也会触发全局快捷方式。”如果系统范围的全局快捷方式是您所需要的,我不记得Qt有任何现成的功能,更不用说QML了
您将不得不求助于特定于平台的API来完成这项工作。例如,在windows上,这就是函数。我使用XGrab并创建了QThread的子类(因为有单独的事件循环)来将其与Qt信号集成 短路激活剂
#ifndef SHORTCUTACTIVATOR_H
#define SHORTCUTACTIVATOR_H
#include <QThread>
class ShortcutActivator : public QThread
{
Q_OBJECT
public:
void run();
signals:
void activated();
public slots:
void end();
private:
bool terminate = false;
};
#endif // SHORTCUTACTIVATOR_H
\ifndef短路激励器
#定义短路激励器
#包括
类ShortcutActivator:公共QThread
{
Q_对象
公众:
无效运行();
信号:
无效激活();
公众时段:
空端();
私人:
bool终止=假;
};
#endif//SHORTCUTACTIVATOR\u H
shortcutactivator.cpp
#include "shortcutactivator.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void ShortcutActivator::end() {
this->terminate = true;
}
void ShortcutActivator::run() {
Display* dpy = XOpenDisplay(0);
Window root = DefaultRootWindow(dpy);
XEvent ev;
unsigned int modifiers = Mod1Mask; // AnyModifier; // ControlMask | ShiftMask | AnyModifier;
int keycode = XKeysymToKeycode(dpy,XK_space);
Window grab_window = root;
Bool owner_events = False;
int pointer_mode = GrabModeAsync;
int keyboard_mode = GrabModeAsync;
XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, pointer_mode, keyboard_mode);
XGrabKey(dpy, keycode, modifiers | Mod2Mask , grab_window, owner_events, pointer_mode, keyboard_mode);
XGrabKey(dpy, keycode, modifiers | LockMask, grab_window, owner_events, pointer_mode, keyboard_mode);
XGrabKey(dpy, keycode, modifiers | LockMask | Mod2Mask, grab_window, owner_events, pointer_mode, keyboard_mode);
XSelectInput(dpy, root, KeyPressMask );
while(true)
{
XNextEvent(dpy, &ev);
switch(ev.type)
{
case KeyPress:
printf("Key pressed\n");
emit this->activated();
default:
break;
}
if(this->terminate)
break;
}
XCloseDisplay(dpy);
XUngrabKey(dpy,keycode,modifiers,grab_window);
XUngrabKey(dpy,keycode,modifiers | Mod2Mask,grab_window);
XUngrabKey(dpy,keycode,modifiers| LockMask,grab_window);
XUngrabKey(dpy,keycode,modifiers | LockMask | Mod2Mask,grab_window);
}
#包括“shortcutactivator.h”
#包括
#包括
void ShortcutActivator::end(){
此->终止=真;
}
void ShortcutActivator::run(){
显示*dpy=XOpenDisplay(0);
窗口根=默认根窗口(dpy);
XEvent电动汽车;
无符号整数修饰符=Mod1Mask;//AnyModifier;//控制掩码|移位掩码| AnyModifier;
int keycode=XKeysymToKeycode(dpy,XK_空间);
窗口抓取\窗口=根;
Bool owner_events=False;
int pointer_mode=GrabModeAsync;
int keyboard_mode=GrabModeAsync;
XGrabKey(dpy、键码、修改器、抓取窗口、所有者事件、指针模式、键盘模式);
XGrabKey(dpy、键码、修改器、Mod2Mask、grab_窗口、所有者事件、指针模式、键盘模式);
XGrabKey(dpy、键码、修改器、锁掩码、抓取窗口、所有者事件、指针模式、键盘模式);
XGrabKey(dpy、键码、修改器、锁掩码、Mod2Mask、抓取窗口、所有者事件、指针模式、键盘模式);
XSelectInput(dpy、根、按键掩码);
while(true)
{
XNextEvent(dpy和ev);
开关(电动型)
{
外壳按键:
printf(“按下键”);
发射此->激活();
违约:
打破
}
如果(此->终止)
打破
}
XCloseDisplay(dpy);
XUngrabKey(dpy、键码、修改器、抓取窗口);
XUngrabKey(dpy、键码、修饰符、Mod2Mask、抓取窗口);
XUngrabKey(dpy、键码、修改器、锁掩码、抓取窗口);
XUngrabKey(dpy、键码、修饰符|锁掩码| Mod2Mask、抓取窗口);
}
Qt5不再支持该库。哦,是的,你说得对。github上有一个lib可用于支持qt5(至少使用qt5.4进行了测试)。但无论如何,这可能是更多的一个工作的OSA,但我需要的快捷键工作时,窗口是不可见的,所以没有焦点。