想要讓 GUI 應用的體驗更上層樓,加入快捷鍵不失為一個好方法,而在 PyQt 中要綁定快捷鍵有幾個作法以下將一一介紹。
本篇中的範例將承襲前篇的計算機。
方法一:透過選單綁定
此方法偏好的使用場景為應用程式全局綁定,將會優先觸發。
用 Qt Designer 打開 GUI 設計介面,加入一個選單後在物件屬性的 Shortcut 項目點擊即可輸入快捷鍵。鍵入欲設定的快捷鍵後請等 2 秒以避免其他按鍵也被錄入快捷鍵設定,如果連續輸入的話可以設定Chord Shortcuts快捷鍵組合(類似 Sublime Text 中的 ⌘K,⌘B)。
透過選單加入快捷鍵之後,就可以在選單中看到快捷鍵的輸入圖示,按 Qt Designer 選單的 [Form] > [Preview] 預覽檢查是否綁定成功。
如果找不到 Menubar 可以在物件內容區的最上層項目(如圖中的 MainWindow)上按右鍵點選 Create Menu Bar。
接著在 GUI 的主程式中加入綁定事件的程式碼。
def __init__(self):
# ...
self.menuClear.triggered.connect(self.clearInput)
def clearInput(self):
self.lEquation.setText('0')
打開 GUI,隨意輸入一些數字之後按下 ⌘K,就可以看到清 0 啦~
方法二:監聽 KeyPress 事件
此方法偏好的使用場景為應用程式層級全局綁定。
除了選單的方法之外,也可以用監聽的方法直接捕捉想要的鍵盤鍵入事件,直接在 GUI 主程式中加入:
def keyPressEvent(self, event):
modifiers = event.modifiers()
key = event.key()
ctrl = modifiers & QtCore.Qt.ControlModifier
shift = modifiers & QtCore.Qt.ShiftModifier
print('{}{}{}'.format(
'ctrl-' if ctrl else '',
'shift-' if ctrl else '',
chr(key) if key <= 255 else key,
))
if ctrl and key == QtCore.Qt.Key_K:
self.clear()
參考可用的 Qt.KeyboardModifier 以及 Qt.Key 常數。
打開 GUI,隨意輸入一些數字之後按下 ⌘K,就可以看到清 0 啦~注意這兩個方法同時用的話只會觸發方法一。
方法三:透過 EventFilter 補獲 KeyPress 事件
不過上述的方法在有預設行為時會有問題,例如想要為輸入框加入快捷鍵,此時不能直接綁定 KeyPress 事件,這將造成無法輸入文字問題的問題,因此解法就需要使用 EventFilter,可參考過去關於 EventFilter的文章,只要檢查 event 是否為 QEvent.KeyPress 即可,該 event 用法即和方法二相同。