如何确定Qt.KeyEvent Shift + 0将导致什么?

时间:2016-07-25 10:38:26

标签: qt localization internationalization pyqt qt5

我正在使用Qt编写一个辅助工具,它允许用户仅使用键盘操作鼠标。真正讨厌老鼠的人也可以使用它。

enter image description here enter image description here

这个应用程序的独特挑战正在扩展Qt的可能性,但幸运的是Qt具有弹性。

用户按下Caps Lock激活工具,之后工具会窃取焦点。屏幕上出现一个网格,用户按下每次移动鼠标较小的按键。

按住鼠标左键0,网格消失。添加Alt双击。

按住Shift 0应该单击鼠标右键,按Ctrl Shift 0应该在中间单击。

我面临的问题是,在我的键盘上,Shift+0会产生QKeyEvent(QKeyEvent.KeyPress, Qt.NoModifier, Qt.Key_ParenRight)(所以,)),这根本不能保证。如果我的计算机使用日语IME,我将获得QKeyEvent(QKeyEvent.KeyPress, Qt.ShiftModifier, Qt.Key_0)

japanese kb layout

帮助,如何获取有关用户当前键盘布局的信息,以便我可以选择正确的Qt.KeyEvent来监听?

2 个答案:

答案 0 :(得分:0)

你做不到。即使您知道所有可能的布局和当前布局,您如何区分用户按下shift+<key>或打开大写锁定的用户并按<key>

这里的问题是你使用shift作为修饰符而不是。 因此,要么您继续以这种方式提供用户更改其设置的方式,要么使用标准修改键回退。

更新:查看评论

答案 1 :(得分:0)

即使您可以知道当前布局,也无法保证给定的键组合可以在不同布局之间进行转换。某些键可能根本不可用,并且某些键组合可能根本不可能(因为使用了shift键的冲突)。

唯一可行的通用解决方案是将键盘快捷键视为可翻译字符串。这意味着决定应用程序的一组默认快捷方式,然后基于您要支持的每个区域设置的最常用键盘布局来确定它们的providing translatations

有了这些,在运行时,您可以创建本地化快捷方式字符串到函数的映射 - 从而允许您独立于当前区域设置中指定的实际组合键来解释键事件。

请注意,像这样的系统也可以轻松支持用户配置键盘快捷键(因为一般机制几乎相同)。

PS:

正如评论中所指出的,你应该避免使用QKeyEvent.modiifiers(),因为它不可靠。请改用QGuiApplication.keyboardModifiers()