Skip to main content
 首页 » 编程设计

python之如何在纯 python 或 : How to bind the key left of the [1] to a shortcut in Qt 中从硬件键号/扫描码获取实际键名

2025年05月04日13yjmyzz

我的最终目标是将 [1] 键左侧的键绑定(bind)到 pyqt 中的快捷键,无论是什么键盘布局(qwerty、qwertz、azerty...)。 qt 不直接支持。

因此,要么我正在寻找 Qt 文档中未提及(或隐藏在某处)的方法,要么更可能的是,在此之前通过将硬件 key 编号转换为程序启动时当前布局中的实际键。

然后我可以将实际 key 提供给 pyqt,或者任何其他工具包,那时不需要知道任何东西。

单键左边的键有时有键号“1”(见http://pic.dhe.ibm.com/infocenter/aix/v7r1/index.jsp?topic=%2Fcom.ibm.aix.keyboardtechref%2Fdoc%2Fkybdtech%2FKey.htm)。

如果我在 qt 中拦截这个键并打印出它的“nativeScanCode”,我得到的结果是“49”。

所以总而言之,我更喜欢仅使用 python 的解决方案,但依赖 Qt 也很好。

原因: 原因是这是一个使用起来非常舒适的键(关于布局)但高度依赖于语言。在某些键盘语言中,它甚至是一个“死键”,需要第二个键来创建带有变音符号的字符。

如果您想自己测试,只需将 z 和 y 键与 qwerty 和 qwertz 一起使用,这是比左边的键更简单的示例,但原则上它是相同的问题。 目标是一个快捷键,无论是qwertz还是qwerty,总是由键盘左下角的按键触发(顾名思义,这两者的区别就是z和y颠倒了)

请您参考如下方法:

如果你想实现一个独立于键盘布局的快捷方式,你需要重新实现你的小部件的 keyPressEvent 并检查 keyEvent.nativeScanCode() 值。例如,要跟踪分配给 QWERTY 中的“Z”和 QWERTZ 中的“Y”的键,您可以使用以下内容:

class MyWidget(QtGui.QWidget): 
      def keyPressEvent(self, event): 
          if event.nativeScanCode() == 52: 
              print "Pressed!" 

请注意重音键是特殊的。在某些布局中它是一个死键,这就是为什么在某些系统中 keyPressEvent 可能直到下一个键被按下才会出现。参见 this question .

QShortCut是基于QKeySequence的,QKeySequence不支持原生扫码,所以QShortCut不能用于这个任务。