我想检测一个键序列是否被按下,并想在 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 的文档:
Key events are sent to the widget with keyboard input focus when keys are pressed or released.
这意味着,如果你想使用QKeyEvent
,你需要有键盘焦点。过滤这些事件也不会在概念上改变这一点。我不确定您从哪里得到过滤的想法。
您可能想研究替代解决方案,例如它是如何在 kwin 中实现的,等等。一般来说,请谨慎处理此用例。它可以在最终用户没有注意到的情况下做一些奇怪的事情。
你可以看看这个类:
QxtGlobalShortcut Class Reference
你可以这样写:
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();
}
主程序
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 库,请访问以下链接:
关于c++ - 如何检测 Qt 中的全局键序列按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23193038/