一个月没写文章了,最近项目中需要自定义快捷键,支持ctrl+数字(主键盘)和ctrl+数字(小键盘)。

ctrl+数字(主键盘)比较好弄,代码如下所示。

void HotKeySetDialog::keyPressEvent(QKeyEvent *event)
{//数字0x30-0x39bool isNumber = event->key() >= 0x30 && event->key() <= 0x39;bool isCtrl = event->modifiers() & Qt::ControlModifier;if (isNumber  && isCtrl){QString  number= char(event->key());QString keySequence = "Ctrl+" + number;//设置快捷键,一般使用开源库QxtGlobalShortcut的setShortcut方法QxtGlobalShortcut* gShortcutForScreenShot=new QxtGlobalShortcut(this);connect(gShortcutForScreenShot, SIGNAL(activated()), this, SLOT(loadScreenShot()));gShortcutForScreenShot->setShortcut(QKeySequence(keySequence));}
}

因为QxtGlobalShortcut默认是不支持小键盘的,且Qt::key 这个枚举中也没有定义小键盘的值。所以在设置小键盘是得做些改动。

setShotCut内部注册快捷键时使用的是keycode,键盘的keycode一览表如下所示。

字母和数字键的键码值(keyCode)
按键 键码 按键 键码 按键 键码 按键 键码
A 65 J 74 S 83 1 49
B 66 K 75 T 84 2 50
C 67 L 76 U 85 3 51
D 68 M 77 V 86 4 52
E 69 N 78 W 87 5 53
F 70 O 79 X 88 6 54
G 71 P 80 Y 89 7 55
H 72 Q 81 Z 90 8 56
I 73 R 82 0 48 9 57
数字键盘上的键的键码值(keyCode) 功能键键码值(keyCode)
按键 键码 按键 键码 按键 键码 按键 键码
0 96 8 104 F1 112 F7 118
1 97 9 105 F2 113 F8 119
2 98 * 106 F3 114 F9 120
3 99 + 107 F4 115 F10 121
4 100 Enter 108 F5 116 F11 122
5 101 - 109 F6 117 F12 123
6 102 . 110        
7 103 / 111        
控制键键码值(keyCode)
按键 键码 按键 键码 按键 键码 按键 键码
BackSpace 8 Esc 27 Right Arrow 39 -_ 189
Tab 9 Spacebar 32 Down Arrow 40 .> 190
Clear 12 Page Up 33 Insert 45 /? 191
Enter 13 Page Down 34 Delete 46 `~ 192
Shift 16 End 35 Num Lock 144 [{ 219
Control 17 Home 36 ;: 186 /| 220
Alt 18 Left Arrow 37 =+ 187 ]} 221
Cape Lock 20 Up A

从表中可以看出event->key()的值实际上就是主键盘数字键的keycode,但是小键盘数字键的event->key()取值范围也是0x30-0x39,这就导致无法区分是主键盘的数字键还是小键盘的数字键。不过QKeyEvent提供了一个nativeVirtualKey()方法,可以获取按键的keycode。

ctrl+数字(主键盘)代码如下所示。

void HotKeySetDialog::keyPressEvent(QKeyEvent *event)
{int keyCode = event->nativeVirtualKey();bool isNumberPad = keyCode>= 0x60 && keyCode <= 0x69;bool isCtrl = event->modifiers() & Qt::ControlModifier;if (isNumberPad&& isCtrl){QString  number= char(event->key());QString keySequence = "Ctrl+" + number;//此时可以修改setShortcut方法,添加一个keyCode参数,默认值为0(使用主键盘的数字键),如果不为0(使用小键盘
//的数字键),注册时直接使用该keyCode,不需要做转换,详见修改后的setShortcut方法。QxtGlobalShortcut* gShortcutForScreenShot=new QxtGlobalShortcut(this);connect(gShortcutForScreenShot, SIGNAL(activated()), this, SLOT(loadScreenShot()));gShortcutForScreenShot->setShortcut(QKeySequence(keySequence),keyCode);}
}

修改后的setShortcut方法。

bool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut,quint32 keyCode)
{m_keyCode = keyCode;if (keyCode != 0){Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;mods = shortcut.isEmpty() ? Qt::KeyboardModifiers(0) : Qt::KeyboardModifiers(shortcut[0] & allMods);const quint32 nativeMods = nativeModifiers(mods);const bool res = registerShortcut(keyCode, nativeMods);shortcuts.insert(qMakePair(keyCode, nativeMods), &qxt_p());if (!res)qWarning() << "QxtGlobalShortcut failed to register 1";return res;}else{Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;key = shortcut.isEmpty() ? Qt::Key(0) : Qt::Key((shortcut[0] ^ allMods) & shortcut[0]);mods = shortcut.isEmpty() ? Qt::KeyboardModifiers(0) : Qt::KeyboardModifiers(shortcut[0] & allMods);const quint32 nativeKey = nativeKeycode(key);const quint32 nativeMods = nativeModifiers(mods);const bool res = registerShortcut(nativeKey, nativeMods);shortcuts.insert(qMakePair(nativeKey, nativeMods), &qxt_p());if (!res)qWarning() << "QxtGlobalShortcut failed to register 2";return res;}
}

Qt之如何识别小键盘(数字键盘)相关推荐

  1. 87键键盘实现小键盘数字/键盘改建软件

    由于本人用的是87键键盘,缺失小键盘,有时玩游戏又需要小键盘,买个外接的小键盘又麻烦,所以百度找了一个改键软件,经过火绒检查无毒无害,如下>>>>>>>> ...

  2. Ubuntu 16.04 小键盘数字键盘开机自动启动

    一.先安装软件 sudo apt-get install numlockx 二.编辑  /etc/rc.local 文件,使用vi / vim 命令编辑,如 sudo vim /etc/rc.loca ...

  3. 锁定计算机小键盘,笔记本电脑数字键盘已锁定!如何打开: 按什么键

    反收集. 打开和关闭小键盘的方法实际上是相同的,但是因为每个笔记本电脑都有不同的设计和配置. 因此,复制我们的实际操作时可能会出现一些问题. 打开和关闭三种笔记本键盘的步骤. 方法1: 首先,我们首先 ...

  4. qt for Android点击edit输入框,弹出系统默认输入法数字键盘界面

    前言: 用qt 开发Android,确实有许多坑,不好填,比如如题这项功能,如果输入的框内想输入纯数字,点击输入框后弹出的是系统默认的输入法,但是确实在中文输入或者英文输入界面, 输入数字还得切换一下 ...

  5. 计算机小键盘顺序,为什么电脑、电话数字键盘排列顺序不同?

    这两样东西是很多人天天都在用的,但相信绝大多数人都没有发现它们的不一样:看看电脑键盘右侧的数字区,再看看电话拨号键盘,有没有发现不一样? 没错,同样都有0-9十个阿拉伯数字,但而这的排列顺序完全不同! ...

  6. 锁定计算机小键盘,笔记本数字键盘锁了要怎么办【图文教程】

    我们平时上网的时候都会使用到键盘,如果没有键盘我们的工作将无法继续下去,而看似简单的键盘殊不知其中还是有很多学问的.键盘其实也是一种输入型的装置,它可以将我们指令输入到电脑中从而实现对电脑的操控,不论 ...

  7. 键盘数字测试软件,小键盘数字测试

    小键盘数字测试 贡献者:游客137036747 类别:数字 时间:2020-06-23 16:34:48 收藏数:12 评分:0 返回上页 举报此文章 请选择举报理由: 广告/谣言/欺诈 政治敏感 色 ...

  8. linux pycharm 数字键盘失效

    linux下 pycharm 社区版,2020.01.02版本 pycharm中数字键失效,小键盘是键盘锁关闭时的状态,且按Num键无法解除 2. 键盘上方数字键为符号键,按不按shift都是输入符号 ...

  9. linux服务器远程桌面 数字键盘不能用

    linux服务器远程 数字键盘不能用 xface快捷键,数字键盘 https://wiki.archlinux.org/index.php/Activating_Numlock_on_Bootup_( ...

  10. mac数字键盘错乱_苹果手机数字键盘 苹果电脑键盘打不出数字解决办法

    苹果电脑跟苹果手机一样,是电子设备中的佼佼者.但也因为其好看的外表和出色的性能受到很多人的喜爱.那么苹果电脑键盘打不出数字解决办法有什么呢?下面就让afU123小编来告诉大家吧,欢迎阅读. 进行基本设 ...

最新文章

  1. linux硬盘写0,linux – kworker消耗90%的IO和零磁盘写入
  2. 解决maven无法下载jar的问题
  3. asp.net mvc5 设置Area下的为启动页
  4. Ubuntu设置宽带连接DSL
  5. 巧用.mdb后缀数据库做后门
  6. Android JSON数据与实体类之间的相互转化-------GSON的简单用法
  7. Python类、模块、包的概念及区别
  8. (Maven配置)Failed to read artifact descriptor for xxx:jar解决方法
  9. ASP.net校友录毕业设计(源代码+论文+开题报告+答辩PPT)ASP.NET小型证券术语解释及翻译系统的设计与开发(源代码+论文)
  10. java调用soap接口_java远程调用soap协议接口
  11. 空间解析几何 | 向量、数量积、向量积、混合积、距离公式
  12. Python字符串的‘ ’,“ ”,''' '''
  13. linux配置文件密码加密工具,Linux下利用openssl对文件进行加密和解密
  14. python比较运算符中大于等于且小于等于的表达方式
  15. ugui 转轮_(转)unity3D的FingerGestures插件
  16. 01 基础入门:概念名词
  17. MyBatis中获取Oracle序列
  18. 浅谈zookeeper
  19. 20210725个人周复盘
  20. 【游戏引擎Easy2D】一篇打通引擎进阶类型,Keycode+MouseCode+Image

热门文章

  1. 排列组合相关知识及组合数与杨辉三角形的关系(初学者篇)
  2. 服务器被入侵怎么办,如何预防
  3. ISelectionMgr Interface
  4. HDOJ5455 Fang Fang(模拟)
  5. 代写品牌故事-品牌故事如何写才感人
  6. 计算机台式内存条,台式电脑怎么装内存条_台式电脑加装内存条方法-win7之家
  7. BAT大牛亲授从零起步基于ElasticSearch的搜房网(前后端集成)实战(第二章需求分析和数据库设计)
  8. python中卡方检验_python 使用卡方检验
  9. Windows 7下旋转屏幕的快捷键
  10. 不确定性原理的前世今生(转载)