Qt获得没有事件监听器的应用程序状态

时间:2014-09-01 16:35:52

标签: qt keypress

我需要知道在r开始时是否按下了一个键(让我们说main())。见:

int main(int argc, char *argv[])
{
    if(R is pressed)
    {} // Do a few things

    // Do amazing stuff whatever happened
    return a.exec();
}

但是我无法找到一种方法来为所有平台(win,mac,lin)做到这一点,我发现的唯一一件事就是windows的技巧:Using GetKeyState()这不是很令人满意。

2 个答案:

答案 0 :(得分:2)

如果要检查修改键(shift,control,alt),可以使用QGuiApplication::queryKeyboardModifiers()

int main(int argc, char *argv[])
{
    if(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier))
    {} // Do a few things

    // Do amazing stuff whatever happened
    return a.exec();
}

答案 1 :(得分:1)

您可以使用Qxt中的QxtGlobalShortcut类。它提供了一个全球快捷方式,即#34; hotkey"并且即使应用程序未处于活动状态也会触发:

#include <QApplication>

#include <QxtGlobalShortcut>
#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QEventLoop loop;

    QxtGlobalShortcut* shortcut = new QxtGlobalShortcut();
    shortcut->setShortcut(QKeySequence("R"));
    QObject::connect(shortcut, SIGNAL(activated()), shortcut, SLOT(setDisabled()));
    QObject::connect(shortcut, SIGNAL(activated()), &loop,SLOT(quit()));
    QTimer::singleShot(300,&loop,SLOT(quit()));

    loop.exec();

    if(!shortcut->isEnabled())
    {
        //R is pressed
    }

    ...


    return a.exec();
}

这里我们等待最多300毫秒来检查按键是否被按下。发出activated()信号时,将禁用快捷方式并退出事件循环。否则,将激活计时器的超时并退出事件循环。

获取Qxt和编译源后,应将这些添加到.pro文件中:

CONFIG  += qxt

QXT     += core gui