2013-06-20 88 views
4

我想了解如何用Qt處理各種事件,並發現我無法理解的關鍵修飾符的問題,例如, CtrlShiftAlt等我在Qt Creator中創建了一個默認的Qt GUI應用程序,用於擴展QMainWindow,並發現下面的示例不會產生可理解的結果。捕獲修飾鍵Qt

void MainWindow::keyPressEvent(QKeyEvent *event) 
{ 
    qDebug() << "Modifier " << event->modifiers().testFlag(Qt::ControlModifier); 
    qDebug() << "Key " << event->key(); 
    qDebug() << "Brute force " << (event->key() == Qt::Key_Control); 
} 

當brute force方法返回正確的值時,對事件使用modifiers()函數永遠不會成立。

我做錯了什麼?

回答

14

嘗試使用此檢查轉變:

if(event->modifiers() & Qt::ShiftModifier){...}

此檢查控制:

if(event->modifiers() & Qt::ControlModifier){...}

等。這對我來說很好。

編輯:

要獲得滾輪事件的修飾符,您需要檢查傳遞給你的wheelEvent()方法QWheelEvent對象:

void MainWindow::wheelEvent(QWheelEvent *wheelEvent) 
{ 
    if(wheelEvent->modifiers() & Qt::ShiftModifier) 
    { 
     // do something awesome 
    } 
    else if(wheelEvent->modifiers() & Qt::ControlModifier) 
    { 
     // do something even awesomer! 
    } 
} 
+0

看起來情節變厚了。只有當另一個鍵被按下時,修飾符才起作用。如果我按Ctrl您建議的if語句不會成立。如果我按Ctrl + 任何換檔修改器的作品。測試正在OSX 10.8.4上執行,這可能會影響此... – user29291

+0

進一步的測試顯示,使用 if(event-> modifiers()&Qt :: ControlModifier)和任何其他修改器僅在keyPressEvent,並且只有當另一個鍵與修飾符一起被觸擊時才能正常工作。最終目標是將這項工作放在事件過濾器中進行輪子事件,但這根本不起作用。 – user29291

+0

查看更新的答案。讓我知道這是否適合你。 –

5

根據該文件,QKeyEvent::modifiers不能總是可信的。嘗試使用QApplication::keyboardModifiers()靜態函數。


Qt 5 Doc. – Qt::KeyboardModifiers QKeyEvent::modifiers() const

警告:此功能不能總是可信的。例如,用戶可以通過同時按下兩個Shift鍵並釋放其中的一個來混淆它。

+0

我正在用Macbook Pro與外部鼠標和鍵盤一起使用此功能,並發現修改器只能在筆記本電腦上使用觸摸板時使用,而不能在外部鼠標上使用觸摸板。 – user29291

+0

注意添加一個鏈接或一些更多的信息,說什麼文檔說「QKeyEvent :: modifiers'不能總是被信任」? – ssc

+0

無法信任QKeyEvent :: modifiers - http://qt-project.org/doc/qt-5/qkeyevent.html#modifiers –