[英]QKeySequence to QKeyEvent
我正處於這種情況,我試圖讀取一個JSON配置文件,該文件指示哪些鍵命令映射到給定的操作。 例如:
...
{
"Action": "Quit",
"Combo" : "CTRL+Q"
},
...
從組合標記構造QKeySequence
是微不足道的,但我需要監視QKeyEvent
以觸發操作。 請注意我必須監視QKeyEvent
因為它們在應用程序中也用於其他目的。 即僅監視QKeySequence
的關鍵命令是QKeySequence
的(如果可能的話)。
編寫自定義解析器以為每個"Combo"
標記構造QKeyEvent
對象時,是否還有將QkeyEvent
與QKeySequence
進行比較? 例如:
QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) {
//somehow convert to QKeyEvent
}
通常,您無法比較QKeyEvent
和QKeySequence
對象。 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());
}
需要注意的是它沒有任何意義的轉換QKeySequence
到QKeyEvent
,不過,既然你要選擇一個特定的事件類型,如QEvent::KeyPress
或QEvent::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.