如何在Qt中检测全局按键顺序按下
How to detect global key sequence press in 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());
在这两种情况下,当我的应用程序窗口打开时,我都能检测到按键,但当窗口最小化或隐藏时,它会失败。如何解决这个问题?
请参阅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
这个代码应该至少可以与Qt4一起使用。它为我打印出调试语句。你可以很容易地在你的端验证这一点。
要获取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"));
- 为什么在全局范围内使用"extern int a"似乎不行?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 使用constexpr的全局初始化顺序
- C 11指定静态/全局变量的构造顺序
- 静态全局变量初始化顺序
- 全局可变初始化顺序
- C++全局变量初始化顺序
- 全局变量的顺序会改变C /OpenGL的性能
- C++初始化:常量全局与静态类成员的顺序
- 确保全局变量的初始化顺序正确
- 全局常量定义的顺序
- 何时使用外部链接初始化全局常量,避免静态初始化顺序惨败
- 全局变量的实例化顺序
- 内联变量仿真:我可以使用全局静态引用来强制函数中静态变量的初始化顺序吗?
- 写入全局变量的顺序
- 非静态/静态/全局/子类成员的初始化顺序
- 静态/全局对象的创建顺序
- 全局构造函数调用的顺序是什么?
- 如何在Qt中检测全局按键顺序按下
- 全局对象和静态变量之间的破坏顺序是什么