如何创建QKeySequence,如“Fn”+ Key_Up

时间:2015-04-08 14:29:10

标签: c++ qt keyboard-shortcuts


正如我从Qt文档(QKeySequenceQt全局命名空间)中理解的那样,我不能使用笔记本Fn键作为快捷键修饰符。
Qt知道的唯一修饰符是:{ {1}},ShiftControlAlt。但没有Meta

但可能存在一些hacky方式?比如直接指定Fn代码。

代码:

Fn

1 个答案:

答案 0 :(得分:3)

首先,Fn键不是经典修饰键。 (克里斯已经说过了。)

某些上下文

如果按下经典修饰键(ShiftControlAltMeta),键盘会发送密钥代码。 操作系统处理此密钥代码并将其提供给相关的应用程序。

Fn密钥很特别。一些制造商在键盘微控制器上处理它,这将在下面描述。还有一些其他人发送了Fn密钥的经典密钥代码。

系统处理键盘微控制器上的Fn

如果系统处理键盘微控制器上的Fn键:

您可以假设键盘内部有类似键和键码之间的转换表。如果保持Fn键,则键盘使用另一个转换表。某些键具有相同的键代码,而其他键具有另一个键代码。 (这是现实的极其简化的模型,但是对于这个例子它可以工作。)

解决方案

由于制造商不是以同样的方式实现Fn密钥,因此没有适用于所有键盘的简单解决方案。 我认为应该可以将以下小型解决方案与一个大型解决方案结合起来。但我不会完全解决这个问题,我认为这并不是很奇特。

Fn键在键盘微控制器上处理

如果在键盘微控制器上处理Fn键: 处理键盘返回的密钥代码。例如,我的键盘在Fn + F1 VolumeMute密钥代码上发送。这只有在两个表之间存在差异时才有效,如上所述。

如果您的解决方案无法使用所有设备,您只需尝试通过哪种组合键发出Qt Key。例如,在我的系统中,组合Fn + F1就是这个Qt-Key:Qt::Key_VolumeMute

也可以在第一次启动时询问用户按此组合并保存密钥代码。 (QWidget::keyPressEventQKeyEvent::key

组合使用

Fn是经典密钥

如果Fn是经典密钥: 查找哪个Qt-Key是您的Fn密钥。 (我不确定这一点,但我认为Fn密钥是Qt::Key_F32。但是你需要检查一下。有些键盘可能会返回另一个密钥代码。) 然后做这样的事情:Qt multiple key combo event

基于驱动程序

理论上:可能会询问某些键盘是否实际按下Fn键。 (在Linux系统上,这应该类似/proc/acpi/ibm//sys/devices/platform/。但这非常依赖于驱动程序。)