c++ - 如何创建 QKeySequence 像 "Fn"+ Key_Up

标签 c++ qt keyboard-shortcuts


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

但可能存在某种黑客方式?就像直接指定 Fn 代码一样。

代码:

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

最佳答案

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

一些背景

如果按下经典修饰键(ShiftControlAltMeta),键盘发送 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::keyPressEventQKeyEvent::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/

相关文章:

c++ thrift 客户端不使用 ssl(SSL_connect 挂起)

c++ - 错误 : no match for operator<<

c++ - 在 Qt 中将 system() 与变量一起使用

visual-studio-2012 - 在 Visual Studio 中阻止自动格式化忽略命令

javascript - 在 Google Chrome 中禁用 Alt 功能(快捷方式)

java - 在 Android Studio 或 IDEA 中将类字段添加到现有构造函数的快捷方式

c++ - 从 QFontDatabase::addApplicationFont 获取字体系列名称

c++ - 正确的 QueryPerformanceCounter 函数实现/时间每次都改变

javascript - Golang中如何使用javascript获取特定网站元素或提交表单

c++ - 在 QTreeview 中使用 QCombobox 委托(delegate)项