為 PyQt 製作的 GUI 應用程式加入快捷鍵

想要讓 GUI 應用的體驗更上層樓,加入快捷鍵不失為一個好方法,而在 PyQt 中要綁定快捷鍵有幾個作法以下將一一介紹。

本篇中的範例將承襲前篇的計算機

方法一:透過選單綁定

此方法偏好的使用場景為應用程式全局綁定,將會優先觸發。

用 Qt Designer 打開 GUI 設計介面,加入一個選單後在物件屬性的 Shortcut 項目點擊即可輸入快捷鍵。鍵入欲設定的快捷鍵後請等 2 秒以避免其他按鍵也被錄入快捷鍵設定,如果連續輸入的話可以設定Chord Shortcuts快捷鍵組合(類似 Sublime Text 中的 ⌘K,⌘B)。

add menu & type shortcut

透過選單加入快捷鍵之後,就可以在選單中看到快捷鍵的輸入圖示,按 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 用法即和方法二相同。

References

  1. QKeyEvent Class | Qt GUI 5.15.8