如何检测Qt中的全局按键顺序?

我想要检测一个按键序列是否被按下,并想要在Qt中执行某个任务。 目前,我可以检测某些小部件的按键,但是如何检测全局按键。 就全球而言,我的意思是即使应用程序被最小化或隐藏,也应该检测按键。

我试着为应用程序做一个eventFilter ,首先像这样重载QObject::eventFilter

 bool GlobalEventFilter::eventFilter(QObject *Object, QEvent *Event) { if (Event->type() == QEvent::KeyPress) { QKeyEvent *KeyEvent = (QKeyEvent*)Event; switch(KeyEvent->key()) { case Qt::Key_F1: cout<<"F1 press detected"<<endl; return true; default: break; } } return QObject::eventFilter(Object,Event); } 

然后安装该对象作为我的应用程序的eventFilter

 QApplication a(argc,argv); a.installEventFilter(new GlobalEventFilter()); 

我也试过这样做:

 QCoreApplication::instance()->installEventFilter(new GlobalEventFilter()); 

在这两种情况下,我都能够在应用程序窗口打开时检测按键,但在窗口最小化或隐藏时失败。 如何解决这个问题?

Solutions Collecting From Web of "如何检测Qt中的全局按键顺序?"

请参阅QKeyEvent的文档:

当键被按下或释放时,按键事件被发送到具有键盘输入焦点的小部件。

这意味着,如果你想使用QKeyEvent ,你需要有键盘焦点。 过滤这些事件也不会在概念上改变这一点。 我不知道你从哪里得到过滤的想法。

您可能需要考虑其他解决方案,例如如何在kwin中实现它等等。一般来说,要小心这个用例。 没有最终用户的注意,它可以做怪异的事情。

你可以看看这个班级:

QxtGlobalShortcut类参考

你可以这样写:

main.cpp中

 #include <QxtGlobalShortcut> #include <QApplication> #include <QMainWindow> #include <QDebug> class MyGlobalShortcutHandler : public QObject { Q_OBJECT public: explicit MyGlobalShortcutHandler(QObject *parent = 0) : QObject(parent) { m_globalShortcut.setShortcut(QKeySequence("Ctrl+Shift+X")); m_globalShortcut.setEnabled(true); connect(&m_globalShortcut, SIGNAL(activated()), SLOT(handleGlobalShortcut())); } public slots: void handleGlobalShortcut() { qDebug() << "Global shortcut handled"; } private: QxtGlobalShortcut m_globalShortcut; }; #include "main.moc" int main(int argc, char **argv) { QApplication application(argc, argv); QMainWindow mainWindow; MyGlobalShortcutHandler myGlobalShortcut(); mainWindow.show(); return application.exec(); } 

main.pro

 TEMPLATE = app TARGET = main greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += qxt QXT = core gui SOURCES += main.cpp 

建立和运行

 qmake-qt4 && make && ./main 

这个代码至少应该和Qt 4一起工作。 它打印出我的调试语句。 你可以很容易地验证这一点。

要获得libqxt库,请访问以下链接:

http://dev.libqxt.org/libqxt/wiki/Home

这个特性在Qt中没有实现。 你可以使用Qxt 。 Qxt是Qt的一个扩展库,提供了一套跨平台的工具类来添加Qt中不易获得的功能。 它具有全局快捷键(热键),即使应用程序被最小化也可检测按键。

将应用程序编译并链接到Qxt后,可以包含QxtGlobalShortcut:

 #include <QxtGlobalShortcut> 

用法示例:

 QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(window); connect(shortcut, SIGNAL(activated()), window, SLOT(toggleVisibility())); shortcut->setShortcut(QKeySequence("Ctrl+Shift+F12"));