正如我从Qt文档(QKeySequence,Qt全局命名空间)中了解到的,我不能使用笔记本Fn键作为快捷修饰符。
Qt知道的唯一修饰符是:Shift、Control、Alt、Meta。但是没有Fn!
但可能存在某种讨厌的方式吗?比如直接指定Fn代码。
代码:
m_actionGoToFirstPage->setShortcut( QKeySequence( Qt::Key_Up /*| Qt::Fn ???*/ ) );发布于 2015-04-09 01:07:45
首先,Fn键不是一个经典的修饰符键。(克里斯已经说过了。)
一些背景
如果按下一个经典的修饰符键(Shift、Control、Alt、Meta),键盘就会发送一个键代码。操作系统处理这个密钥代码并将其交给相关的应用程序。
Fn密钥是特殊的。一些厂家在键盘微控制器上处理它,这是下面描述的。还有一些人为Fn密钥发送了一个经典的密钥代码。
键盘微控制器上的Fn键处理
如果系统在键盘微控制器上处理Fn键:
您可以假设键盘内部有类似于键和键代码之间的转换表。如果保持Fn键,键盘将使用另一个转换表。一些密钥具有相同的密钥代码,另一些密钥具有另一个密钥代码。(这是非常简化的现实模型,但对于本例来说,它是有效的。)
解决方案
由于制造商以不完全相同的方式实现Fn密钥,所以没有在所有键盘上工作的简单解决方案。我认为应该有可能将以下小的解决方案合并成一个大的解决方案。但我不会完全解决这个问题,我认为这并不是真正的幻想。
Fn键在键盘微控制器上处理。
如果在键盘微控制器上处理Fn 键:处理键盘返回的键代码。例如,我的键盘在Fn + F1上发送VolumeMute键代码。只有当两个表之间存在差异时,这才会起作用,上文对此作了解释。
如果您的解决方案不能工作所有的设备,您可以简单地尝试什么Qt键是由什么键组合发出。例如,在我的系统中,Fn + F1的组合是Qt键:Qt::Key_VolumeMute。
也可以要求用户在第一次开始按此组合并保存密钥代码。( QWidget::keyPressEvent与QKeyEvent::key相结合)
Fn是一个经典的密钥
If 是一个经典的键:查找哪个Qt键是您的Fn键。(我不确定这一点,但我认为Fn密钥是Qt::Key_F32。但你得检查一下这个。一些键盘有可能返回另一个密钥代码。)然后做这样的事情:Qt多键组合事件。
驱动程序
理论上:可以问一些键盘是否实际按下了Fn键。(在Linux系统上,这应该类似于/proc/acpi/ibm/或/sys/devices/platform/。但这是非常依赖司机的。)
https://stackoverflow.com/questions/29517583
复制相似问题