PyQt6 键盘事件处理的实现及实例代码

 更新时间:2025年09月24日 11:10:44   作者:小灰灰搞电子  
本文主要介绍了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 键 或 Command 键(macOS)
  • Qt.KeypadModifier:小键盘按键
  • Qt.NoModifier:无修饰键

(2)、检测修饰键

在重写 keyPressEventkeyReleaseEvent 时,通过 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 = KeyDemoWindow()
    window.show()
    app.exec()

(5)、注意事项

  1. 跨平台差异

    • macOS 上 ControlModifier 对应 Command 键
    • 使用 Qt.MetaModifier 检测真正的 Control 键(macOS)
  2. 特殊按键处理

    # 检测 Enter 键
    if event.key() == Qt.Key_Return:
        print("Enter 键按下")
    
    # 检测方向键
    if event.key() == Qt.Key_Left:
        print("左方向键")
    
  3. 事件传递

    • 调用 event.ignore() 允许事件继续传递
    • 调用 event.accept() 标记事件已处理

(6)、修饰键应用场景

组合键典型功能
Ctrl+C复制
Ctrl+V粘贴
Ctrl+Z撤销
Shift+方向键文本选择
Alt+F4关闭窗口

4、按键值

以下为PyQt6中QKeyEvent的常用按键值表格整理,按类别分类便于查阅:

(1)、字母与数字键

按键值 (Qt.Key)说明
A - ZQt.Key_A 至 Qt.Key_Z大写字母A-Z
0 - 9Qt.Key_0 至 Qt.Key_9数字键

(2)、功能键

按键说明
EscQt.Key_Escape退出键
F1 - F12Qt.Key_F1 至 Qt.Key_F12功能键
TabQt.Key_Tab制表键
CapsLockQt.Key_CapsLock大写锁定键
EnterQt.Key_Return回车键
BackspaceQt.Key_Backspace退格键

(3)、方向键

按键说明
Qt.Key_Up上箭头
Qt.Key_Down下箭头
Qt.Key_Left左箭头
Qt.Key_Right右箭头

(4)、修饰键

按键说明
ShiftQt.Key_ShiftShift键
CtrlQt.Key_ControlCtrl键
AltQt.Key_AltAlt键
MetaQt.Key_MetaWindows/Command键

(5)、符号键

按键说明
~Qt.Key_AsciiTilde波浪号
! - @Qt.Key_Exclam 至 Qt.Key_At符号键
[ - \Qt.Key_BracketLeft 等方括号/反斜杠

(6)、其他常用键

按键说明
SpaceQt.Key_Space空格键
DeleteQt.Key_Delete删除键
HomeQt.Key_HomeHome键
EndQt.Key_EndEnd键
PageUpQt.Key_PageUp页上翻
PageDownQt.Key_PageDown页下翻

5、注意事项

  1. 事件过滤优先级

    • 控件未处理事件时传递给父容器
    • 使用 event.ignore() 传递事件给父级
    • 使用 event.accept() 标记已处理(默认)
  2. 特殊按键
    方向键、功能键等需通过 Qt.Key 枚举检测,例如:

    Qt.Key.Key_Left   # ← 键
    Qt.Key.Key_F1      # F1 功能键
    
  3. 国际化处理
    使用 text() 而非 key() 可适应不同键盘布局,如法语键盘的 “A” 和 “Q” 位置互换。

6、高级应用

  1. 事件过滤器
    通过 installEventFilter() 全局监听键盘事件:

    self.obj.installEventFilter(self)  # 安装过滤器
    
    def eventFilter(self, obj, event):
        if event.type() == QEvent.Type.KeyPress:
            print("全局捕获按键:", event.key())
        return super().eventFilter(obj, event)
    
  2. 快捷键系统
    使用 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, QVBoxLayout, 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:
            self.close()
        self.update()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

上、下、左、右键控制红色方框移动,Ctrl+q键退出。

到此这篇关于PyQt6 键盘事件处理的实现示例的文章就介绍到这了,更多相关PyQt6 键盘事件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python协程与 asyncio 库详情

    python协程与 asyncio 库详情

    这篇文章主要介绍了python协程与 asyncio 库详情,文章基于python展开详细内容,具有一定的参考价值。需要的小伙伴可以参考一下
    2022-05-05
  • python实现高精度求自然常数e过程详解

    python实现高精度求自然常数e过程详解

    这篇文章主要为大家介绍了python实现高精度求自然常数e过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python多线程与同步机制浅析

    Python多线程与同步机制浅析

    线程(Thread)是操作系统能够进行运算调度的最小单位;线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源
    2022-12-12
  • 用python爬取电脑壁纸实例代码

    用python爬取电脑壁纸实例代码

    大家好,本篇文章主要讲的是用python爬取电脑壁纸实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Linux下python与C++使用dlib实现人脸检测

    Linux下python与C++使用dlib实现人脸检测

    这篇文章主要为大家详细介绍了Linux下python与C++使用dlib实现人脸检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Python局部函数及用法详解(含nonlocal关键字)

    Python局部函数及用法详解(含nonlocal关键字)

    局部函数有哪些特征,在使用时需要注意什么呢?接下来就给读者详细介绍 Python 局部函数的用法,对Python局部函数相关知识感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • python实现简单的计算器功能

    python实现简单的计算器功能

    这篇文章主要为大家详细介绍了python实现简单的计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Python读取sqlite数据库文件的方法分析

    Python读取sqlite数据库文件的方法分析

    这篇文章主要介绍了Python读取sqlite数据库文件的方法,结合实例形式分析了Python引入sqlite3模块操作sqlite数据库的读取、SQL命令执行等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • python中zip()方法应用实例分析

    python中zip()方法应用实例分析

    这篇文章主要介绍了python中zip()方法的应用,实例分析了使用zip()方法创建字典的相关技巧,需要的朋友可以参考下
    2016-04-04
  • Python中的集合介绍

    Python中的集合介绍

    今天小编就为大家分享一篇关于Python中的集合介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论