2014-09-01 87 views
2

我需要知道當main()啓動時是否按下了一個鍵(比如r)。請參閱:Qt獲取應用程序狀態沒有事件監聽器

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

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

但我不能找到一個辦法做到這一點適用於所有平臺(贏,蘋果,林),我發現的唯一一件事情是Windows中的一個絕招:Using GetKeyState()這是不是很滿意..

+0

你的意思是關鍵是被壓制? – UmNyobe 2014-09-01 22:03:13

+0

這是非常不尋常的目標。您確定要實施這種奇怪的行爲並讓您的用戶使用它嗎?也許你應該使用更常用的方法,例如命令行選項或GUI。如果你仍然想這樣做,請描述你爲什麼需要它。 – 2014-09-01 22:43:08

+0

@UmNyobe是的,這就是我的意思 – 2014-09-02 07:51:08

回答

2

您可以使用QGuiApplication::queryKeyboardModifiers()

得到了QXT源和編譯後,你應該將這些添加到您的.pro文件

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

您可以使用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()信號時,快捷鍵被禁用,並且事件循環被取消。否則,定時器的超時被激活並且事件循環退出。如果您想檢查修飾鍵(移動,控制,ALT)

CONFIG += qxt 

QXT  += core gui 
+0

這聽起來像是一個很好的解決方案,但是我們不能僅僅通過'Qt'實現嗎? – 2014-09-02 07:50:37