如何在Qt中检测全局键序列?

use*_*458 6 c++ windows 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);
}
Run Code Online (Sandbox Code Playgroud)

然后安装该对象作为eventFilter我的应用程序:

QApplication a(argc,argv);
a.installEventFilter(new GlobalEventFilter());
Run Code Online (Sandbox Code Playgroud)

我也试过这样做:

QCoreApplication::instance()->installEventFilter(new GlobalEventFilter());
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都可以在应用程序窗口打开时检测按键,但在窗口最小化或隐藏时失败.怎么解决这个?

Nej*_*jat 6

这个特性在 Qt 中没有实现。您可以使用Qxt。Qxt 是 Qt 的扩展库,提供了一套跨平台实用程序类来添加 Qt 中不可用的功能。它具有全局快捷键(热键),即使应用程序最小化,它也可以检测按键。

编译应用程序并将其链接到 Qxt 后,您可以包含 QxtGlobalShortcut:

#include <QxtGlobalShortcut>
Run Code Online (Sandbox Code Playgroud)

用法示例:

QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(window);
connect(shortcut, SIGNAL(activated()), window, SLOT(toggleVisibility()));
shortcut->setShortcut(QKeySequence("Ctrl+Shift+F12"));
Run Code Online (Sandbox Code Playgroud)


lpa*_*app 5

请参阅QKeyEvent的文档:

当按键被按下或释放时,按键事件被发送到具有键盘输入焦点的小部件。

这意味着,如果您想使用QKeyEvent,则需要获得键盘焦点。过滤这些事件也不会在概念上改变这一点。我不确定你从哪里得到过滤的想法。

您可能想研究替代解决方案,例如它是如何在 kwin 中实现的,等等。一般来说,要小心这个用例。它可以在最终用户没有注意到的情况下做一些奇怪的事情。

你可以看看这个类:

QxtGlobalShortcut 类参考

你可以这样写:

主程序

#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();
}
Run Code Online (Sandbox Code Playgroud)

主程序

TEMPLATE = app
TARGET = main
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += qxt
QXT = core gui
SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)

构建和运行

qmake-qt4 && make && ./main
Run Code Online (Sandbox Code Playgroud)

这段代码应该至少适用于 Qt 4。它为我打印出调试语句。您可以轻松地对此进行验证。

要获取 libqxt 库,请访问以下链接:

http://dev.libqxt.org/libqxt/wiki/Home