Qt之如何识别小键盘(数字键盘)
2017-11-04 10:17
1121 查看
一个月没写文章了,最近项目中需要自定义快捷键,支持ctrl+数字(主键盘)和ctrl+数字(小键盘)。
ctrl+数字(主键盘)比较好弄,代码如下所示。
因为QxtGlobalShortcut默认是不支持小键盘的,且Qt::key 这个枚举中也没有定义小键盘的值。所以在设置小键盘是得做些改动。
setShotCut内部注册快捷键时使用的是keycode,键盘的keycode一览表如下所示。
从表中可以看出event->key()的值实际上就是主键盘数字键的keycode,但是小键盘数字键的event->key()取值范围也是0x30-0x39,这就导致无法区分是主键盘的数字键还是小键盘的数字键。不过QKeyEvent提供了一个nativeVirtualKey()方法,可以获取按键的keycode。
ctrl+数字(主键盘)代码如下所示。
修改后的setShortcut方法。
ctrl+数字(主键盘)比较好弄,代码如下所示。
void HotKeySetDialog::keyPressEvent(QKeyEvent *event) { //数字0x30-0x39 bool 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 |
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; } }
相关文章推荐
- Win10如何默认开启数字小键盘以方便输入密码
- 如何开机启动数字键盘
- 如何识别键盘左右的shift,Ctrl或Alt键
- 如何使用alt键+数字键盘上的数字键打出特殊符号
- Android开发之如何自定义数字键盘详解
- 如何关闭iPhone浏览器自动将数字识别为电话号码
- 如何在Win10登录画面默认开启小键盘数字锁定?
- ThinkPad -- 如何启用/禁用内嵌数字键盘
- Qt如何向系统发送键盘和鼠标事件?
- caffe中如何训练自己的手写数字识别系统?
- 如何在minicom下运行可键盘中断结束的qt-embedded程序
- [AHK]想知道如何判断数字小键盘是否开启?
- EditText如何在使用数字键盘的情况下输入多个小数点
- 如何不将iphone上面的数字识别为电话
- QT如何捕获全局的键盘事件?
- 如何在QT里使用Maliit软键盘
- ubuntu 如何自动开启VIM小键盘数字键?
- TensorFlow-1: 如何识别数字
- QT--如何格式化显示数字?