0
点赞
收藏
分享

微信扫一扫

Qt之如何识别小键盘(数字键盘)


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

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

从表中可以看出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;
}
}





举报

相关推荐

0 条评论