侦测键盘与快速键组合
这篇教学会介绍在 PyQt6 的视窗里,侦测按下哪个键盘的按键,以及是否按下键盘的快速键 ( 热键 ) 组合,透过键盘按键的事件,进行简单的互动应用。
快速导览:
因为 Google Colab 不支援 PyQt6,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
侦测按下键盘的按键
建立 PyQt6 的 Widget 元件之后,可以使用 keyPressEvent 侦测键盘按下事件,将事件对应到指定的函数,在函数内使用 key() 方法,就能取得键盘按键的 keycode,下方的程序码执行后,会透过 QLabel 印出目前按下的键盘 keycode。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setGeometry(20,20,100,30)
def key(self):
keycode = self.key() # 取得該按鍵的 keycode
label.setText(str(keycode)) # QLabel 印出 keycode
Form.keyPressEvent = key # 建立按下鍵盤事件,對應到 key 函式
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
from PyQt6.QtGui import QEnterEvent
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.setMouseTracking(True)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(20,20,100,30)
def keyPressEvent(self, event):
keycode = event.key() # 取得該按鍵的 keycode
self.label.setText(str(keycode)) # QLabel 印出 keycode
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
PyQt6 keycode 对照表
在 PyQt6 里大部分的 keycode 都与标准 keycode 相同,例如 A~Z、0~9、特殊符号...等,然而像是 Enter、Del 等特殊键,则会出现比较不同的数值,下方列出常用按键的对照表。
| 按键 | keycode | 按键 | keycode | 按键 | keycode |
|---|---|---|---|---|---|
| 1 | 49 | A | 65 | delete | 16777219 |
| 2 | 50 | B | 66 | enter | 16777220 |
| 3 | 51 | C | 67 | shift | 16777248 |
| 4 | 52 | D | 68 | up | 16777235 |
| 5 | 53 | E | 69 | down | 16777237 |
| 6 | 54 | F | 70 | left | 16777234 |
| 7 | 55 | G | 71 | right | 16777236 |
| 8 | 56 | H | 72 | ctrl | 16777250 |
| 9 | 57 | I | 73 | alt | 16777251 |
| 0 | 48 | J | 74 | command | 16777249 |
| - | 45 | K | 75 | space | 32 |
| ` | 96 | L | 76 | - | |
| = | 61 | M | 77 | - | |
| [ | 91 | N | 78 | - | |
| ] | 93 | O | 79 | - | |
| |92 | P | 80 | - | ||
| ; | 59 | Q | 81 | - | |
| ' | 39 | R | 82 | - | |
| , | 44 | S | 83 | - | |
| / | 47 | T | 84 | - | |
| . | 46 | U | 85 | - | |
| - | V | 86 | - | ||
| - | W | 87 | - | ||
| - | X | 88 | - | ||
| - | Y | 89 | - | ||
| - | Z | 90 | - |
侦测键盘快速键组合
如果要侦测键盘的快速键组合 ( 热键 ),例如 Ctrl+O、Ctrl+C...等,除了自己写程序判断,也可以加载 PyQt6.QtGui 的 QKeySequence 模组搭配 QShortcut() 方法,就可以侦测快速键 ( 方法位置和 PyQt5 不同 ),使用方法如下:
shortcut = QtWidgets.QShortcut(QKeySequence("快速鍵組合"), Form)
shortcut.activated.connect(fn)
# Form 為主視窗元件
# 快速鍵組合例如 Ctrl+C、Alt+C...等,不可以有空格,不區分大小寫
# fn 為按下快速鍵組合要執行的函式
下方的程序码执行后,当用户按下快速键组合,就会透过 QLabel 显示目前的快速键组合内容。
from PyQt6 import QtWidgets
from PyQt6.QtGui import QKeySequence, QShortcut
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setGeometry(20,20,100,30)
def ctrl_o():
label.setText('Ctrl + O')
shortcut1 = QShortcut(QKeySequence("Ctrl+O"), Form) # 偵測 Ctrl + O
shortcut1.activated.connect(ctrl_o)
def alt_shift_c():
label.setText('Alt + Shift + C')
shortcut2 = QShortcut(QKeySequence("Alt+Shift+C"), Form) # 偵測 Alt + Shift + C
shortcut2.activated.connect(alt_shift_c)
Form.show()
sys.exit(app.exec())
class 的写法:
from PyQt6 import QtWidgets
from PyQt6.QtGui import QKeySequence, QShortcut
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.setMouseTracking(True)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(20,20,100,30)
shortcut1 = QShortcut(QKeySequence("Ctrl+O"), self) # 偵測 Ctrl + O
shortcut1.activated.connect(self.ctrl_o)
shortcut2 = QShortcut(QKeySequence("Alt+Shift+C"), self) # 偵測 Alt + Shift + C
shortcut2.activated.connect(self.alt_shift_c)
def ctrl_o(self):
self.label.setText('Ctrl + O')
def alt_shift_c(self):
self.label.setText('Alt + Shift + C')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
微信扫码关注
抖音扫码关注