c++ - 如何检测 Qt 中的全局键序列按下?

标签 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);
}

然后将该对象安装为我的应用程序的 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 库,请访问以下链接:

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

关于c++ - 如何检测 Qt 中的全局键序列按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23193038/

相关文章:

c++ - 在main()外调用一个函数

windows - 如何从 Windows 应用程序监视 Intel Controller 上 RAID 阵列的状态?

C++ - Qt - Visual Studio 2010 - 具有图形用户界面和控制台的应用程序

c++ - 将类添加到基本 Qt GUI 应用程序时出现 Qt 链接器错误

android - Qt API 获取应用程序用户数据在 iOS 和 Android 上的保存位置

c++ - 指向特征矩阵的指针数组

c++ - 使用 glDrawArrays 绘制多个模型

c++ - 如何 C++ 静态编译第三方库,其中包含其他人在主应用程序中使用的另一个库

windows - 批处理文件编码

正则表达式将组与 PowerShell 中的字符串匹配