QML中的全局捷径

时间:2016-02-14 11:16:54

标签: qt qml keyboard-shortcuts qt5 qt5.5

我正在尝试在QML(Qt 5.5)中创建一个始终在运行的应用程序,并在用户按下alt+space时显示。

我尝试在QML中使用Action类,但它仅在窗口具有焦点时才有效,而不是在窗口不可见时。

我也尝试过QShortcut(这不太理想,因为我的应用程序不是基于QWidget),但我没有结果。

eventFilter上使用QApplication似乎在窗口不可见时无效。

有办法吗?

3 个答案:

答案 0 :(得分:1)

如果你需要系统范围的全局快捷方式,我不记得Qt开箱即用的东西,更不用说QML了。

您必须使用特定于平台的API才能完成此任务。例如在窗口上就是BOOL WINAPI RegisterHotKey()函数。

答案 1 :(得分:1)

我已经使用XGrab并创建QThread的子类(因为单独的事件循环)将它与Qt信号集成。

shortcutactivator.h

#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

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);
}

答案 2 :(得分:0)

我从来没有在QML中实现过应用,但我认为您要寻找的是全局快捷方式模块(http://libqxt.bitbucket.org/doc/tip/qxtglobalshortcut.html)。 它是一个&#34;即使应用程序未处于活动状态,也会触发全局快捷方式。&#34;