python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > 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 枚举定义修饰键,常用值包括:

(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)、组合键检测方法

(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 键盘事件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文