开发者

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

目录
  • 一、键盘事件处理详解
    • 1、核心事件处理器
    • 2、事件对象 QKeyEvent
    • 3、修饰键处理
      • (1)、修饰键类型
      • (2)、检测修饰键
      • (3)、组合键检测方法
      • (4)、完整示例
      • (5)、注意事项
      • (6)、修饰键应用场景
    • 4、按键值
      • (1)、字母与数字键
      • (2)、功能键
      • (3)、方向键
      • (4)、修饰键
      • (5)、符号键
      • (6)、其他常用键
    • 5、注意事项
      • 6、高级应用
      • 二、示例演示
        • 1、效果展示
          • 2、源码分享

          一、键盘事件处理详解

          在 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)、检测修饰键

          在重写 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 android= 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、效果展示

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

          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 键盘事件内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

          0

          上一篇:

          下一篇:

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          最新开发

          开发排行榜