本文主要是介绍PyQt6 键盘事件处理的实现及实例代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起...
一、键盘事件处理详解
在 PyQt6 中,键盘事件处理是 GUI 开发的核心功能之一,通过重写特定事件处理器实现。以下是关键要点和完整实现方案:
1、核心事件处理器
按键按下事件
重写 keyPressEvent
方法处理按键动作:
def keyPressEvent(self, event): key = event.key() # 获取按键编码 if key == Qt.Key.Key_A: # 检测特定按键 print("A键被按下")
按键释放事件
重写 keyReleaseEvent
处理释放动作:
def keyReleaseEvent(self, event): if event.key() == Qt.Key.Key_Space: print("空格键已释放")
2、事件对象 QKeyEvent
方法 | 说明 | 示例 |
---|---|---|
key() | 获取按键编码 | Qt.Key.Key_Enter |
text() | 获取字符文本 | event.text() = "A" |
modifiers() | 检测修饰键 (Ctrl/Shift 等) | event.modifiers() & Qt.KeyboardModifier.ControlModifier |
isAutoRepeat() | 判断是否为长按重复事件 | if not event.isAutoRepeat(): |
3、修饰键处理
在 PyQt6 中,键盘事件(QKeyEvent
)的修饰键(Modifier Keys)用于检测用户是否同时按下了特殊功能键(如 Shift、Ctrl、Alt 等)。以下是修饰键的详细说明和使用方法:
(1)、修饰键类型
PyQt6 通过 Qt.KeyboardModifier
枚举定义修饰键,常用值包括:
Qt.ShiftModifier
:Shift 键Qt.ControlModifier
:Ctrl 键(Windows/linux)或 Command 键(MACOS)Qt.AltModifier
:Alt 键(Windows/Linux)或 Option 键(macOS)Qt.MetaModifier
:Windows 键 或 Cophpmmand 键(macOS)Qt.KeypadModifier
:小键盘按键Qt.NoModifier
:无修饰键
(2)、检测修饰键
在重写 keyPressEvent
或 keyReleaseEvent
时,通过 event.modifiers()
获取修饰键状态:
from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QMainWindow class MainWindow(QMainWindow): def keyPressEvent(self, event): modifiers = event.modifiers() # 检测单个修饰键 if modifiers & Qt.ControlModifier: print("Ctrl 键被按下") # 检测组合修饰键 if modifiers == (Qt.ControlModifier | Qt.ShiftModifier): print("Ctrl+Shift 组合键") # 检测按键+修饰键 if event.key() == Qt.Key_S and modifiers & Qt.ControlModifier: print("Ctrl+S 保存操作")
(3)、组合键检测方法
方法 1:位运算检测
def keyPressEvent(self, event): if event.key() == Qt.Key_A and event.modifiers() & Qt.ControlModifier: print("Ctrl+A 全选")
方法 2:
QKeyCombination
(PyQt6.4+)from PyQt6.QtGui import QKeyCombination def keyPressEvent(self, event): combo = QKeyCombination(event.modifiers(), event.key()) if combo == QKeyCombination(Qt.ControlModifier, Qt.Key_C): print("Ctrl+C 复制")
(4)、完整示例
from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel from PyQt6.QtCore import Qt class KeyDemoWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel("按任意键测试修饰键", self) self.setCentralWidget(self.label) def keyPressEvent(self, event): mod_text = [] modifiers = event.modifiers() if modifiers & Qt.ShiftModifier: mod_text.append("Shift") if modifiers & Qt.ControlModifier: mod_text.append("Ctrl") if modifiers & Qt.AltModifier: mod_text.append("Alt") key_name = event.text() if event.text().isprintable() else f"Key_{event.key()}" self.label.setText(f"按键: {key_name} | 修饰键: {', '.join(mod_text)}") if __name__ == '__main__': app = QApplication([]) window android= KeyDemoWindow() window.show() app.exec()
(5)、注意事项
跨平台差异:
- macOS 上
ControlModifier
对应 Command 键 - 使用
Qt.MetaModifier
检测真正的 Control 键(macOS)
- macOS 上
特殊按键处理:
# 检测 Enter 键 if event.key() == Qt.Key_Return: print("Enter 键按下") # 检测方向键 if event.key() == Qt.Key_Left: print("左方向键")
事件传递:
- 调用
event.ignore()
允许事件继续传递 - 调用
event.accept()
标记事件已处理
- 调用
(6)、修饰键应用场景
组合键 | 典型功能 |
---|---|
Ctrl+C | 复制 |
Ctrl+V | 粘贴 |
Ctrl+Z | 撤销 |
Shift+方向键 | 文本选择 |
Alt+F4 | 关闭窗口 |
4、按键值
以下为PyQt6中QKeyEvent
的常用按键值表格整理,按类别分类便于查阅:
(1)、字母与数字键
按键 | 值 (Qt.Key) | 说明 |
---|---|---|
A - Z | Qt.Key_A 至 Qt.Key_Z | 大写字母A-Z |
0 - 9 | Qt.Key_0 至 Qt.Key_9 | 数字键 |
(2)、功能键
按键 | 值 | 说明 |
---|---|---|
Esc | Qt.Key_Escape | 退出键 |
F1 - F12 | Qt.Key_F1 至 Qt.Key_F12 | 功能键 |
Tab | Qt.Key_Tab | 制表键 |
CapsLock | Qt.Key_CapsLock | 大写锁定键 |
Enter | Qt.Key_Return | 回车键 |
Backspace | Qt.Key_Backspace | 退格键 |
(3)、方向键
按键 | 值 | 说明 |
---|---|---|
↑ | Qt.Key_Up | 上箭头 |
↓ | Qt.Key_Down | 下箭头 |
← | Qt.Key_Left | 左箭头 |
→ | Qt.Key_Right | 右箭头 |
(4)、修饰键
按键 | 值 | 说明 |
---|---|---|
Shift | Qt.Key_Shift | Shift键 |
Ctrl | Qt.Key_Control | Ctrl键 |
Alt | Qt.Key_Alt | Alt键 |
Meta | Qt.Key_Meta | Windows/Command键 |
(5)、符号键
按键 | 值 | 说明 |
---|---|---|
~ | Qt.Key_AsciiTilde | 波浪号 |
! - @ | Qt.Key_Exclam 至 Qt.Key_At | 符号键 |
[ - \ | Qt.Key_BracketLeft 等 | 方括号/反斜杠 |
(6)、其他常用键
按键 | 值 | 说明 |
---|---|---|
Space | Qt.Key_Space | 空格键 |
Delete | Qt.Key_Delete | 删除键 |
Home | Qt.Key_Home | Home键 |
End | Qt.Key_End | End键 |
PageUp | Qt.Key_PageUp | 页上翻 |
PageDown | Qt.Key_PageDown | 页下翻 |
5、注意事项
事件过滤优先级
- 控件未处理事件时传递给父容器
- 使用
event.ignore()
传递事件给父级 - 使用
event.accept()
标记已处理(默认)
特殊按键
方向键、功能键等需通过Qt.Key
枚举检测,例如:Qt.Key.Key_Left # ← 键 Qt.Key.Key_F1 # F1 功能键
国际化处理
使用text()
而非key()
可适应不同键盘布局,如法语键盘的 “A” 和 “Q” 位置互换。
6、高级应用
事件过滤器
通过installEventFilter()
全局监听键盘事件:self.obj.installEventFilter(self) # 安装过滤器 def eventFilter(self, obj, event): if event.type() == QEvent.Type.KeyPress: print("全局捕获按键:", event.key()) return super().eventFilter(obj, event)
快捷键系统
使用QShortcut
实现快捷键绑定:from PyQt6.QtGui import QShortcut shortcut = QShortcut("Ctrl+O", self) shortcut.activated.connect(self.open_file)
二、示例演示
1、效果展示
2、源码分享
import sys import serial from PyQt6.QtCore import QThread, pyqtSignal, Qt from PyQt6.QtSerialPort import QSerialPortInfo from PyQt6.QtWidgets import (QApplication, QMainWindow, QvboxLayoutjs, QHBoxLayout, QWidget, QLabel, QComboBox, QPushButton, QTextEdit, QCheckBox, QSpinBox, QGroupBox) from PyQt6.QtGui import QFont, QIcon, QPalette, QColor,QPainter class MainWindow(QMainWindow): def __init__(self): super().__init__() self.resize(800,600) self.x = 0 self.y = 0 def paintEvent(self, a0, QPaintEvent=None): p = QPainter(self) p.fillRect(self.x,self.y,100,100,Qt.GlobalColor.red) def keyPressEvent(self, event): if event.key() == Qt.Key.Key_Up: self.y-=10 elif event.key() == Qt.Key.Key_Down: self.y+=10 elif event.key() == Qt.Key.Key_Left: self.x-=10 elif event.key() == Qt.Key.Key_Right: self.x += 10 elif event.modifiers() == Qt.KeyboardModifier.ControlModifier and event.key() == Qt.Key.Key_Q: python self.candroidlose() self.update() if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
上、下、左、右键控制红色方框移动,Ctrl+q
键退出。
到此这篇关于PyQt6 键盘事件处理的实现示例的文章就介绍到这了,更多相关PyQt6 键盘事件内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于PyQt6 键盘事件处理的实现及实例代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!