【问题标题】:Qt get application state without event listenerQt 在没有事件监听器的情况下获取应用程序状态
【发布时间】:2014-10-25 22:14:45
【问题描述】:

我需要知道在main() 启动时是否按下了某个键(比如r)。见:

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(),这不是很令人满意...

【问题讨论】:

  • 你的意思是按键被按住了?
  • 这是一个非常不寻常的目标。您确定要实现这种奇怪的行为并让您的用户使用它吗?也许您应该使用更常见的方式,例如命令行选项或 GUI。如果您仍想这样做,请说明您需要它的原因。
  • @UmNyobe 是的,这就是我的意思
  • @PavelStrakhov 我需要在启动时实现一个可供菜鸟使用的重置选项

标签: qt keypress


【解决方案1】:

如果您想检查修饰键(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();
}

【讨论】:

    【解决方案2】:

    您可以使用QxtGlobalShortcut,它是Qxt 中的一个类。它提供了一个全局快捷方式,即“热键”,即使应用程序不活动也会触发:

    #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
    

    【讨论】:

    • 这听起来像是一个很好的解决方案,但我们不能只使用Qt 来达到同样的效果吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2015-02-13
    • 2018-08-04
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多