簡體   English   中英

QKeySequence到QKeyEvent

[英]QKeySequence to QKeyEvent

我正處於這種情況,我試圖讀取一個JSON配置文件,該文件指示哪些鍵命令映射到給定的操作。 例如:

...
{ 
    "Action": "Quit",
    "Combo" : "CTRL+Q"
},
...

從組合標記構造QKeySequence是微不足道的,但我需要監視QKeyEvent以觸​​發操作。 請注意我必須監視QKeyEvent因為它們在應用程序中也用於其他目的。 即僅監視QKeySequence的關鍵命令是QKeySequence的(如果可能的話)。

編寫自定義解析器以為每個"Combo"標記構造QKeyEvent對象時,是否還有將QkeyEventQKeySequence進行比較? 例如:

QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) {
   //somehow convert to QKeyEvent
}

通常,您無法比較QKeyEventQKeySequence對象。 QKeyEvent表示單鍵按下或釋放的事件,而QKeySequence可以包含最多四個鍵的序列,每個鍵具有可選的修飾符信息。

但是,如果您確定鍵序列始終只包含一個鍵,則可以比較這些對象:

bool isEquiv(const QKeyEvent& event, const QKeySequence& seq)
{
    if (seq.count() != 1)
        return false;
    return seq[0] == (event.key() | event.modifiers());
}

您甚至可以將QKeyEvent的轉換函數寫入QKeySequence

QKeySequence toKeySequence(const QKeyEvent& event)
{
    return QKeySequence(event.key() | event.modifiers());
}

需要注意的是它沒有任何意義的轉換QKeySequenceQKeyEvent ,不過,既然你要選擇一個特定的事件類型,如QEvent::KeyPressQEvent::KeyRelease

一個簡單的解決方案(用python編寫):

key = QKeySequence(event.modifiers()|event.key()).toString()

將以字符串形式提供整個序列,例如“Ctrl + Q”。

你可以在快捷方式的詞典中找到(至少在python中)的好處,而QKeySequence不會是可以刪除的。

請注意,這需要您使用正確的typecase和間距。 “ctrl + Q”將不匹配。 為避免出現所有問題,您可以在首次閱讀快捷方式時執行以下操作:

shortcut = shortcut.lower().remove(' ')

並匹配/查找使用

key = QKeySequence(event.modifiers()|event.key()).toString().lower()

或者更好的是:

shortcut = QKeySequence(shortcut).toString()

並直接匹配。

帶有將KeyEvent轉換為KeySequence的代碼的Qt4.7注釋。 (但代碼有缺陷,因為它將來自QKeyEvent.key()的鍵碼的int轉換為字符串。最好使用QKeyEvent.text()?)

此外,費迪南德的答案中的代碼:

QKeySequence(event.key() | event.modifiers())

是不是類型安全(混合int和QKeyboardModifiers),如果轉換為Python在PyQt中失敗,但在PySide中失敗?

此外,“QKeyEvent代表單鍵按下或釋放的事件”並沒有真正解釋它。 QKeyEvent可以告訴你鍵的組合是什么,而不是它們被按下的順序。 當用戶按順序按鍵時,您的應用程序可能會獲得一系列QKeyEvents(取決於您的應用程序是否使用默認與QKeyEvent的重寫處理程序。)后來的QKeyEvents將顯示事件發生時所有關閉的鍵。 。 他們可能不再失敗。 這很復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM