Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检测Qt中的全局键序列按下?_C++_Windows_Qt - Fatal编程技术网

C++ 如何检测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

我想检测是否按下了一个键序列,并想在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);
}
我也试过这样做:

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"));