如何在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())
关键处理逻辑
修饰符顺序与AltGr识别
- 预设修饰符优先级为
Ctrl → Alt → Shift,保证输出顺序统一 - 单独判断
AltGr组合(Ctrl+Alt),避免被拆分为两个独立修饰符
- 预设修饰符优先级为
按键字符串获取
- 无修饰符时:如果按键有可显示字符(如
+),直接用event.text()输出实际字符 - 有修饰符或无显示字符时:通过
QKey(key_code).name()获取按键原始名称,去掉Key_前缀并转为小写(如Key_Plus转为plus)
- 无修饰符时:如果按键有可显示字符(如
测试效果
- 单独按
+→ 输出快捷键:+ - 按
Shift++→ 输出快捷键:Shift+plus - 按
AltGr++→ 输出快捷键:Ctrl+Alt+plus
- 单独按
内容的提问来源于stack exchange,提问作者BPL
相关产品推荐
相关产品推荐

