C++ 如何检测Qt中的全局键序列按下?
我想检测是否按下了一个键序列,并想在Qt中对该事件执行某些任务。目前,我可以检测某些小部件的按键,但如何检测全局按键。全局的意思是,即使应用程序被最小化或隐藏,它也应该检测到按键 我尝试为应用程序创建一个C++ 如何检测Qt中的全局键序列按下?,c++,windows,qt,C++,Windows,Qt,我想检测是否按下了一个键序列,并想在Qt中对该事件执行某些任务。目前,我可以检测某些小部件的按键,但如何检测全局按键。全局的意思是,即使应用程序被最小化或隐藏,它也应该检测到按键 我尝试为应用程序创建一个eventFilter,首先重载QObject::eventFilter,如下所示: bool GlobalEventFilter::eventFilter(QObject *Object, QEvent *Event) { if (Event->type() == QEvent::K
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);
}
我也试过这样做:
QCoreApplication::instance()->installEventFilter(new GlobalEventFilter());
在这两种情况下,当我的应用程序窗口打开时,我都能够检测到按键,但当窗口最小化或隐藏时,按键会失败。如何解决此问题?请参阅以下文档:
按键事件在按键或释放时发送到具有键盘输入焦点的小部件
这意味着,如果您希望使用QKeyEvent
,您需要有键盘焦点。过滤这些事件在概念上也不会改变这一点。我不知道你是从哪里得到过滤的想法的
您可能希望研究其他解决方案,例如如何在kwin中实现它,等等。一般来说,在使用此用例时要小心。它可以在最终用户没有注意到的情况下做一些奇怪的事情
你可以看看这个课程:
你可以这样写:
main.cpp
构建并运行
这段代码至少应该与Qt4一起使用。它为我打印调试语句。你可以很容易地验证这一点
要获取libqxt库,请访问以下链接:
此功能未在Qt中实现。你可以用。Qxt是Qt的扩展库,它提供了一套跨平台实用程序类来添加Qt中不易获得的功能。它具有全局快捷键(热键),即使应用程序最小化,也可以检测按键 编译应用程序并将其链接到Qxt后,可以包括QxtGlobalShortcut:
#include <QxtGlobalShortcut>
我见过很多这样的应用程序。这不是那么困难的任务。事实上,我在使用WinApi之前就做过。我不在乎它是QKeyEvent还是其他什么。如果可能的话,我只想要一种Qt方式。如果没有,我将不得不使用WinApi实现。我无法下载Qxt库。我一直收到这样的错误:此资源的速率限制已超过。@user221458:请尝试使用total commander插件对其进行解压缩。如果您无法管理,我可以为您重新打包。我可以将Qxt用于封闭源代码的商业应用程序吗?我读了它的许可证,我很困惑。我不能在LGPL许可下使用它吗?看起来很有希望,但我不想仅仅为了实现这一点而在我的项目中添加一个额外的库。我无法从他们的网站下载Qxt:我遇到了这个错误:当我尝试打开这个链接时,这个资源的速率限制被超过了:有镜像吗?有时我会遇到同样的错误,有时候我可以得到它。尝试刷新下载链接,可能你会得到它。谢谢你的回答,我知道这是一个很长的时间在这个问题上,但问你可以帮助如果我想要一个鼠标点击我应该写什么?先谢谢你
#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
#include <QxtGlobalShortcut>
QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(window);
connect(shortcut, SIGNAL(activated()), window, SLOT(toggleVisibility()));
shortcut->setShortcut(QKeySequence("Ctrl+Shift+F12"));