我想检测是否按下了一个键序列,并希望在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());
在这两种情况下,我都可以在应用程序窗口打开时检测按键,但在窗口最小化或隐藏时失败。怎么解决这个问题?
答案 0 :(得分:3)
此功能未在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"));
答案 1 :(得分:2)
请参阅QKeyEvent的文档:
当按下或释放按键时,按键事件将被发送到具有键盘输入焦点的小部件。
这意味着,如果您希望使用QKeyEvent
,则需要使用键盘焦点。过滤这些事件也不会在概念上改变这一点。我不确定你从哪里获得过滤的想法。
您可能希望研究其他解决方案,例如如何在kwin中实现它等。一般来说,请注意这个用例。如果最终用户没有注意到它,它可能会做出奇怪的事情。
你可以看看这个课程:
QxtGlobalShortcut Class Reference
你可以写下这样的东西:
#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库,请访问以下链接: