如何创建像 "Fn" + Key_Up 这样的 QKeySequence

How to create QKeySequence like "Fn" + Key_Up


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

但可能存在一些骇人听闻的方式吗?就像直接指定 Fn 代码。

代码:

m_actionGoToFirstPage->setShortcut( QKeySequence( Qt::Key_Up /*| Qt::Fn ???*/ ) );

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

一些上下文

如果按下经典修饰键(ShiftControlAltMeta),键盘会发送一个键码。 OS 处理此键码并将其提供给相关应用程序。

Fn键比较特殊。一些制造商在键盘微控制器上处理它,如下所述。还有一些人发送了 Fn 键的经典键码。

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

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

您可以假设键盘在按键和按键代码之间有内部翻译 table。如果按住 Fn 键,键盘会使用另一种翻译 table。一些键具有相同的键码,另一些键具有另一个键码。 (这是对现实的极其简化的模型,但对于这个例子来说它是有效的。)

解决方案

由于制造商实现 Fn 键的方式不尽相同,因此没有适用于所有键盘的简单解决方案。 我认为应该可以将以下小解决方案组合成一个大解决方案。但我不会完全解决这个问题,我认为这不是很花哨。

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

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

如果您的解决方案不能在所有设备上工作,您可以简单地尝试通过什么组合键发出什么 Qt 键。例如在我的系统上组合 Fn + F1 是这个 Qt-Key: Qt::Key_VolumeMute.

也可以要求用户在第一次启动时按下这个组合并保存键码。 ( QWidget::keyPressEvent in combination with QKeyEvent::key )

Fn是经典键

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

基于驱动程序

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