2017-04-26 77 views
3

我遇到了QML程序問題。在頂層main.qml文件,我有一些鍵盤快捷鍵,像這樣:QML鍵盤快捷鍵會干擾Key OnPressed Events

Shortcut { 
    sequence: "Up" 
    onActivated: { 
    // yadda yadda 
    } 
} 

在另一個文件中,我有幾個Keys.onPressed要求是這樣的:

Keys.onPressed: { 
    if (event.key == Qt.Key_Up) { 
    // yadda yadda 
    } 
} 

顯然,快捷方式正在干擾OnPressed呼叫。當我評論快捷鍵時,OnPressed的工作很好。但是,當它們都處於活動狀態時,Shortcut似乎會攔截鍵盤按鍵並阻止OnPressed啓動。

我知道,用鼠標事件,Qt有「接受」變量。如果您希望事件繼續向下傳播,您可以在OnActivated函數中設置「accepted = false」來完成此操作。但是,我在Shortcuts API中看不到任何等效的「接受」變量。有其他方法可以確保事件傳播正確嗎?

回答

2

爲了表現得像一條快捷方式,Shortcut必須比活動焦點項中的按鍵處理程序具有更高的優先級。否則,它與正常的密鑰處理程序沒有區別。但是,有時候需要重寫快捷方式,就像你一樣。

在Qt 5.8和更早的版本,你可以disable一個Shortcut,以防止它在一定條件下處理快捷事件。例如:

Shortcut { 
    enabled: !someItem.activeFocus 
} 

在Qt 5.9中,爲此引入了一個更好的機制。使用按鍵處理程序的活動焦點項目現在可以通過使用Keys.shortcutOverride接受快捷鍵覆蓋事件來覆蓋快捷方式。例如:

Item { 
    focus: true 
    Keys.onShortcutOverride: { 
     if (event.key == Qt.Key_Up) 
      event.accepted = true 
    } 
    Keys.onUpPressed: ... 
} 
+0

謝謝!我正在使用Qt 5.7。我能夠巧妙地設置/取消設置啓用的變量以實現我的目標。 – user1765354