QKeyEvent
是 PyQt5 中处理键盘事件的核心类(属于 PyQt5.QtGui
模块),当用户按下、释放或长按键盘按键时,会生成该事件对象。它提供了按键信息(如键值、修饰键状态、文本内容等),用于实现键盘交互功能(如快捷键、文本输入、游戏控制等)。以下是详细说明:
1. 核心功能
- 获取按键的 Qt键码(如
Qt.Key_A
)和 原生扫描码。 - 识别修饰键(如 Shift、Ctrl、Alt)的状态。
- 获取按键对应的文本内容(如按
Shift+A
得到 "A")。 - 处理自动重复事件(长按按键时的重复触发)。
2. 事件类型
QKeyEvent
对应以下三种事件类型:
事件类型 | 触发时机 |
---|---|
QEvent.KeyPress | 按键按下时触发 |
QEvent.KeyRelease | 按键释放时触发 |
QEvent.ShortcutOverride | 快捷键冲突时触发(需手动处理) |
3. 关键方法
获取按键信息
方法/属性 | 说明 |
---|---|
key() | 返回 Qt键码(如 Qt.Key_Enter ),与键盘布局无关。 |
nativeScanCode() | 返回操作系统原生的物理键码(如 USB HID 码)。 |
text() | 返回按键的 Unicode 文本(如按 Shift+A 返回 "A")。 |
modifiers() | 返回修饰键的组合状态(如 `Qt.ShiftModifier |
判断事件属性
方法 | 说明 |
---|---|
isAutoRepeat() | 是否为长按导致的自动重复事件。 |
count() | 自动重复事件的触发次数(通常为1)。 |
4. 常见Qt键码
Qt键码常量 | 对应按键 |
---|---|
Qt.Key_Enter | 回车键(小键盘) |
Qt.Key_Return | 回车键(主键盘) |
Qt.Key_Escape | Esc 键 |
Qt.Key_Control | Ctrl 键 |
Qt.Key_Shift | Shift 键 |
Qt.Key_Space | 空格键 |
Qt.Key_A ~ Qt.Key_Z | 字母键 A~Z |
完整列表参考:Qt.Key 枚举文档。
5. 处理键盘事件
在自定义控件或窗口中,重写以下方法处理键盘事件:
示例:响应按键按下事件
python
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget
class MyWidget(QWidget):
def keyPressEvent(self, event: QKeyEvent):
if event.key() == Qt.Key_Enter or event.key() == Qt.Key_Return:
print("回车键被按下")
elif event.key() == Qt.Key_A and event.modifiers() == Qt.ControlModifier:
print("Ctrl+A 组合键被按下")
else:
super().keyPressEvent(event) # 调用父类方法保持默认行为
示例:检测 Esc 键释放
python
def keyReleaseEvent(self, event):
if event.key() == Qt.Key_Escape:
print("Esc 键释放")
6. 修饰键状态判断
通过 modifiers()
方法获取修饰键组合:
python
modifiers = event.modifiers()
if modifiers == (Qt.ControlModifier | Qt.ShiftModifier):
print("同时按下了 Ctrl 和 Shift 键")
7. 自动重复事件处理
长按按键时,系统会持续触发 KeyPress
事件,可通过 isAutoRepeat()
过滤:
python
def keyPressEvent(self, event):
if event.isAutoRepeat():
return # 忽略自动重复事件
if event.key() == Qt.Key_Space:
print("空格键首次按下(非长按)")
8. 与 QShortcut 的区别
QKeyEvent | QShortcut |
---|---|
处理控件级别的按键事件 | 定义全局快捷键(无需焦点) |
需要重写事件方法 | 直接绑定回调函数 |
灵活控制事件传播 | 独立于控件的事件系统 |
9. 注意事项
-
事件传播:
如果未处理事件(如不调用super().keyPressEvent(event)
),事件可能传递给父控件。 -
焦点问题:
只有获得焦点的控件才能接收键盘事件,可通过setFocusPolicy(Qt.StrongFocus)
设置焦点策略。 -
文本输入:
对于需要输入文本的控件(如QLineEdit
),直接使用text()
可能不准确,建议用QInputMethodEvent
。
10. 完整示例
python
from PyQt5.QtWidgets import QApplication, QTextEdit
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent
class MyTextEdit(QTextEdit):
def keyPressEvent(self, event: QKeyEvent):
if event.key() == Qt.Key_Tab:
self.insertPlainText(" ") # 按 Tab 键插入4个空格
event.accept() # 阻止默认行为(焦点切换)
elif event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_S:
print("Ctrl+S 保存操作")
event.accept()
else:
super().keyPressEvent(event) # 其他按键保持默认行为
app = QApplication([])
window = MyTextEdit()
window.show()
app.exec_()
11. 总结
- 用途:处理控件级别的键盘交互(如快捷键、文本输入、游戏控制)。
- 核心方法:
key()
,text()
,modifiers()
。 - 注意:事件传播、焦点策略和自动重复事件过滤。
通过合理利用 QKeyEvent
,可以为 PyQt5 应用添加丰富的键盘交互功能!