Qt QML中的全局快捷方式

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中实现过应用程序,但我认为您需要的是全局快捷方式模块()。 这是一个“即使应用程序未处于活动

我试图在QML(qt5.5)中创建一个应用程序,该应用程序总是在运行,并在用户按下
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,但我需要的快捷键工作时,窗口是不可见的,所以没有焦点。