如何创建像 "Fn" + Key_Up 这样的 QKeySequence
How to create QKeySequence like "Fn" + Key_Up
正如我从 Qt 文档(QKeySequence
、Qt
全局命名空间)中了解到的那样,我不能使用笔记本 Fn
键作为快捷方式修饰符。
Qt 知道的唯一修饰符是: Shift
、Control
、Alt
、Meta
。但是没有Fn
!
但可能存在一些骇人听闻的方式吗?就像直接指定 Fn
代码。
代码:
m_actionGoToFirstPage->setShortcut( QKeySequence( Qt::Key_Up /*| Qt::Fn ???*/ ) );
首先,Fn
键不是经典的修饰键。 (克里斯已经说过了。)
一些上下文
如果按下经典修饰键(Shift
、Control
、Alt
、Meta
),键盘会发送一个键码。
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/
。但这非常依赖于驱动程序。)
正如我从 Qt 文档(QKeySequence
、Qt
全局命名空间)中了解到的那样,我不能使用笔记本 Fn
键作为快捷方式修饰符。
Qt 知道的唯一修饰符是: Shift
、Control
、Alt
、Meta
。但是没有Fn
!
但可能存在一些骇人听闻的方式吗?就像直接指定 Fn
代码。
代码:
m_actionGoToFirstPage->setShortcut( QKeySequence( Qt::Key_Up /*| Qt::Fn ???*/ ) );
首先,Fn
键不是经典的修饰键。 (克里斯已经说过了。)
一些上下文
如果按下经典修饰键(Shift
、Control
、Alt
、Meta
),键盘会发送一个键码。
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/
。但这非常依赖于驱动程序。)