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

era*_*lan 2 c++ qt keyboard-shortcuts


正如我从 Qt 文档(QKeySequenceQt全局命名空间)中了解到的,我不能使用 notebookFn键作为快捷方式修饰符。
Qt 知道的唯一修饰符是:Shift, Control, Alt, Meta。但是没有Fn

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

代码:

m_actionGoToFirstPage->setShortcut( QKeySequence( Qt::Key_Up /*| Qt::Fn ???*/ ) );
Run Code Online (Sandbox Code Playgroud)

小智 5

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

一些上下文

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

Fn关键的是特殊的。一些制造商在键盘微控制器上处理它,如下所述。其他一些发送密钥的经典密钥代码Fn

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

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

您可以假设键盘内部具有键和键代码之间的转换表之类的东西。如果Fn键被按住,键盘将使用另一个转换表。一些键具有相同的键代码,其他一些键具有不同的键代码。(这是现实的极其简化的模型,但对于这个例子它有效。)

解决方案

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

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

如果Fn按键是在键盘微控制器上 处理的处理键盘返回的键码。就比如我的键盘发送Fn+F1VolumeMute关键代码。这仅在两个表之间存在差异时才有效,如上所述。

如果您的解决方案不能在所有设备上工作,您可以简单地尝试由什么键组合发出什么 Qt 键。例如,在我的系统上,组合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/。但这非常依赖于驱动程序。)