You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySide6的keyPressEvent中生成含无修饰符按键的规范快捷键字符串?

解决PySide6按键事件生成正确快捷键字符串的问题

问题说明

原代码在keyPressEvent中处理按键事件时,无法正确生成符合预期的快捷键字符串:

  • 单独按+能正常显示+,但按Shift++时未显示为Shift+plus,按AltGr++时未显示为Ctrl+Alt+plus
  • 需要实现:按指定修饰符顺序排列、按键显示无修饰符的原始字符串(带修饰符时显示键名,无修饰符时显示实际字符)

修改后的代码

from PySide6.QtWidgets import QWidget, QApplication
from PySide6.QtCore import Qt, QKey
import sys

class KeyTestWidget(QWidget):
    def keyPressEvent(self, event):
        # 固定修饰符顺序:Ctrl → Alt → Shift
        modifier_map = [
            (Qt.ControlModifier, "Ctrl"),
            (Qt.AltModifier, "Alt"),
            (Qt.ShiftModifier, "Shift")
        ]
        
        modifiers = []
        # 先处理AltGr(本质是Ctrl+Alt组合)
        if event.modifiers() == (Qt.ControlModifier | Qt.AltModifier):
            modifiers = ["Ctrl", "Alt"]
        else:
            # 按预设顺序收集单个修饰符
            for mod_flag, mod_name in modifier_map:
                if event.modifiers() & mod_flag:
                    modifiers.append(mod_name)
        
        # 获取按键的目标字符串
        key_code = event.key()
        # 无修饰符且有可显示字符时,用实际输入字符
        if not modifiers and event.text():
            key_str = event.text()
        else:
            # 有修饰符或无显示字符时,用按键原始名称(去掉Key_前缀并转小写)
            key_name = QKey(key_code).name().replace("Key_", "")
            key_str = key_name.lower()
        
        # 拼接最终快捷键字符串
        shortcut = "+".join(modifiers) + "+" + key_str if modifiers else key_str
        print(f"快捷键:{shortcut}")
        
        super().keyPressEvent(event)

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

关键处理逻辑

  1. 修饰符顺序与AltGr识别

    • 预设修饰符优先级为Ctrl → Alt → Shift,保证输出顺序统一
    • 单独判断AltGr组合(Ctrl+Alt),避免被拆分为两个独立修饰符
  2. 按键字符串获取

    • 无修饰符时:如果按键有可显示字符(如+),直接用event.text()输出实际字符
    • 有修饰符或无显示字符时:通过QKey(key_code).name()获取按键原始名称,去掉Key_前缀并转为小写(如Key_Plus转为plus)
  3. 测试效果

    • 单独按+ → 输出快捷键:+
    • 按Shift++ → 输出快捷键:Shift+plus
    • 按AltGr++ → 输出快捷键:Ctrl+Alt+plus

内容的提问来源于stack exchange,提问作者BPL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:42:35