如何在Qt中检测全局按键顺序按下

How to detect global key sequence press in Qt?

本文关键字:顺序 全局 检测 Qt      更新时间:2023-10-16

我想检测是否按下了键序列,并想在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"));