我正在尝试在QML(Qt 5.5)中创建一个始终在运行的应用程序,并在用户按下alt+space
时显示。
我尝试在QML中使用Action
类,但它仅在窗口具有焦点时才有效,而不是在窗口不可见时。
我也尝试过QShortcut(这不太理想,因为我的应用程序不是基于QWidget),但我没有结果。
在eventFilter
上使用QApplication
似乎在窗口不可见时无效。
有办法吗?
答案 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;