正如我从 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
),键盘发送 key 代码。
操作系统处理此关键代码并将其提供给相关应用程序。
Fn
键很特殊。一些制造商在键盘微 Controller 上处理它,如下所述。还有一些发送 Fn
键的经典键代码。
系统处理键盘微 Controller 上的Fn
键
如果系统处理键盘微 Controller 上的Fn
键:
您可以假设键盘有内部的东西,例如键和键代码之间的转换表。如果按住 Fn 键,键盘将使用另一个转换表。有些按键具有相同的按键代码,有些按键则具有不同的按键代码。 (这是极其简化的现实模型,但对于这个例子来说它是有效的。)
解决方案
由于制造商实现 Fn
键的方式不尽相同,因此没有适用于所有键盘的简单解决方案。
我认为应该可以将以下小解决方案组合成一个大解决方案。但我不会完全解决这个问题,而且我认为这并不是很奇特。
Fn
键在键盘微 Controller 上处理
如果在键盘微 Controller 上处理 Fn
键:
处理键盘返回的Key code。例如,我的键盘在 Fn
+ F1
上发送 VolumeMute
键代码。仅当两个表之间存在差异时,这才有效,如上所述。
如果您的解决方案不能在所有设备上工作,您可以简单地尝试什么 Qt 键由什么组合键发出。例如,在我的系统上,Fn
+ F1
的组合是这个 Qt-Key:Qt::Key_VolumeMute
。
也可以要求用户在第一次启动时按此组合并保存键码。 ( QWidget::keyPressEvent 与 QKeyEvent::key 结合)
Fn
是经典按键
如果 Fn
是经典键:
查找哪个 Qt 键是您的 Fn
键。 (我对此不确定,但我认为 Fn
键是 Qt::Key_F32
。但是您需要检查一下。某些键盘可能会返回另一个关键代码。)
然后做这样的事情:Qt multiple key combo event .
基于驱动程序
理论上:某些键盘可能会被询问是否确实按下了 Fn
键。 (在 Linux 系统上,这应该类似于 /proc/acpi/ibm/
或 /sys/devices/platform/
。但这非常依赖于驱动程序。)
关于c++ - 如何创建 QKeySequence 像 "Fn"+ Key_Up,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29517583/