Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohoskeyeventconverthelpers.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <qohoskeyeventconverthelpers.h>
5
6#include <QtCore/qmap.h>
7
9
11
12namespace {
13
14const QMap<Qt::Key, QPair<OhosKeyboardModifier, Qt::KeyboardModifier>> qtKeyToModifiersMap = {
15 {Qt::Key_Shift, {OhosKeyboardModifier::SHIFT, Qt::ShiftModifier}},
16 {Qt::Key_Alt, {OhosKeyboardModifier::ALT, Qt::AltModifier}},
17 {Qt::Key_Control, {OhosKeyboardModifier::CTRL, Qt::ControlModifier}},
18 {Qt::Key_Meta, {OhosKeyboardModifier::LOGO, Qt::MetaModifier}},
19};
20
21bool isNoModificatorPressed(Qt::KeyboardModifiers keyboardModifiers)
22{
23 return keyboardModifiers.testFlag(Qt::NoModifier);
24}
25
26bool isOnlyKeypadModificatorOn(Qt::KeyboardModifiers keyboardModifiers)
27{
28 return keyboardModifiers == Qt::KeyboardModifiers(Qt::KeypadModifier);
29}
30
31char tryConvertKeyEventToKeyCharOrNull(const Qt::Key &key, Qt::KeyboardModifiers qtModifiers)
32{
33 bool onlyShiftModPressed = isOnlyShiftModificatorPressed(qtModifiers);
34 bool onlyKeypadModificatorOn = isOnlyKeypadModificatorOn(qtModifiers);
35 bool noModPressed = isNoModificatorPressed(qtModifiers);
36 bool useNoModifiedKeyText = noModPressed || onlyKeypadModificatorOn;
37
38 switch (key) {
39 case Qt::Key_Space: return ' ';
40 case Qt::Key_Backspace: return '\x08';
41 case Qt::Key_Tab: return '\x09';
42 case Qt::Key_Enter: return '\x0D';
43 case Qt::Key_Return: return '\x0D';
44 case Qt::Key_Delete: return '\x7F';
45 case Qt::Key_Escape: return '\x1B';
46 default:
47 break;
48 }
49
50 if (onlyShiftModPressed || useNoModifiedKeyText) {
51 switch (key) {
52 case Qt::Key_A: return 'a';
53 case Qt::Key_B: return 'b';
54 case Qt::Key_C: return 'c';
55 case Qt::Key_D: return 'd';
56 case Qt::Key_E: return 'e';
57 case Qt::Key_F: return 'f';
58 case Qt::Key_G: return 'g';
59 case Qt::Key_H: return 'h';
60 case Qt::Key_I: return 'i';
61 case Qt::Key_J: return 'j';
62 case Qt::Key_K: return 'k';
63 case Qt::Key_L: return 'l';
64 case Qt::Key_M: return 'm';
65 case Qt::Key_N: return 'n';
66 case Qt::Key_O: return 'o';
67 case Qt::Key_P: return 'p';
68 case Qt::Key_Q: return 'q';
69 case Qt::Key_R: return 'r';
70 case Qt::Key_S: return 's';
71 case Qt::Key_T: return 't';
72 case Qt::Key_U: return 'u';
73 case Qt::Key_V: return 'v';
74 case Qt::Key_W: return 'w';
75 case Qt::Key_X: return 'x';
76 case Qt::Key_Y: return 'y';
77 case Qt::Key_Z: return 'z';
78 case Qt::Key_0: return '0';
79 case Qt::Key_1: return '1';
80 case Qt::Key_2: return '2';
81 case Qt::Key_3: return '3';
82 case Qt::Key_4: return '4';
83 case Qt::Key_5: return '5';
84 case Qt::Key_6: return '6';
85 case Qt::Key_7: return '7';
86 case Qt::Key_8: return '8';
87 case Qt::Key_9: return '9';
88 case Qt::Key_QuoteLeft: return '`';
89 case Qt::Key_Minus: return '-';
90 case Qt::Key_Equal: return '=';
91 case Qt::Key_BracketLeft: return '[';
92 case Qt::Key_BracketRight: return ']';
93 case Qt::Key_Backslash: return '\\';
94 case Qt::Key_Semicolon: return ';';
95 case Qt::Key_Apostrophe: return '\'';
96 case Qt::Key_Comma: return ',';
97 case Qt::Key_Period: return '.';
98 case Qt::Key_Slash: return '/';
99 case Qt::Key_ParenRight: return ')';
100 case Qt::Key_Exclam: return '!';
101 case Qt::Key_At: return '@';
102 case Qt::Key_NumberSign: return '#';
103 case Qt::Key_Dollar: return '$';
104 case Qt::Key_Percent: return '%';
105 case Qt::Key_AsciiCircum: return '^';
106 case Qt::Key_Ampersand: return '&';
107 case Qt::Key_Asterisk: return '*';
108 case Qt::Key_ParenLeft: return '(';
109 case Qt::Key_AsciiTilde: return '~';
110 case Qt::Key_Underscore: return '_';
111 case Qt::Key_Plus: return '+';
112 case Qt::Key_BraceLeft: return '{';
113 case Qt::Key_BraceRight: return '}';
114 case Qt::Key_Bar: return '|';
115 case Qt::Key_Colon: return ':';
116 case Qt::Key_QuoteDbl: return '"';
117 case Qt::Key_Less: return '<';
118 case Qt::Key_Greater: return '>';
119 case Qt::Key_Question: return '?';
120 default:
121 break;
122 }
123 }
124
125 return '\0';
126}
127
128}
129
131 QFlags<OhosKeyboardModifier> ohosKeysModifiers, bool keyFromNumPad)
132{
133 auto keyboardModifiers = convertOhosToQtKeyboardModifiers(ohosKeysModifiers);
134 keyboardModifiers.setFlag(Qt::KeypadModifier, keyFromNumPad);
135
136 return keyboardModifiers;
137}
138
139bool isOnlyShiftModificatorPressed(Qt::KeyboardModifiers keyboardModifiers)
140{
141 return keyboardModifiers.testFlag(Qt::ShiftModifier) &&
142 !keyboardModifiers.testFlag(Qt::AltModifier) &&
143 !keyboardModifiers.testFlag(Qt::ControlModifier);
144}
145
147 const Qt::Key &key, Qt::KeyboardModifiers qtModifiers, QFlags<OhosKeyboardModifier> ohosKeysModifiers)
148{
149 auto keyChar = QChar::fromLatin1(tryConvertKeyEventToKeyCharOrNull(key, qtModifiers));
150 bool keyCapsLockFlagOn = ohosKeysModifiers.testFlag(OhosKeyboardModifier::CAPS_LOCK);
151 auto effectiveKeyChar =
152 keyChar.isLetter() && keyCapsLockFlagOn != isOnlyShiftModificatorPressed(qtModifiers)
153 ? keyChar.toUpper()
154 : keyChar;
155 return !effectiveKeyChar.isNull() ? QString(effectiveKeyChar) : QString();
156}
157
159 Qt::KeyboardModifiers lastKeyboardModifiers, QFlags<OhosKeyboardModifier> ohosKeysModifiers, Qt::Key qtKey)
160{
161 auto modifiers = lastKeyboardModifiers;
162 if (qtKeyToModifiersMap.contains(qtKey)) {
163 const auto actualKeyModifiers = qtKeyToModifiersMap.value(qtKey);
164 const auto ohosModifier = actualKeyModifiers.first;
165 const auto qtModifier = actualKeyModifiers.second;
166 modifiers.setFlag(qtModifier, !ohosKeysModifiers.testFlag(ohosModifier));
167 }
168 return modifiers;
169}
170
171}
172
173QT_END_NAMESPACE
Combined button and popup list for selecting options.
Qt::KeyboardModifiers convertOhosToQtKeyboardModifiersWithNumpad(QFlags< OhosKeyboardModifier > ohosKeysModifiers, bool keyFromNumPad)
Qt::KeyboardModifiers convertCurrentOhosKeyModifiersForQGuiApplication(Qt::KeyboardModifiers lastKeyboardModifiers, QFlags< OhosKeyboardModifier > ohosKeysModifiers, Qt::Key qtKey)
bool isOnlyShiftModificatorPressed(Qt::KeyboardModifiers keyboardModifiers)
QString tryConvertQtKeyCodeToKeyText(const Qt::Key &key, Qt::KeyboardModifiers qtModifiers, QFlags< OhosKeyboardModifier > ohosKeysModifiers)
OhosKeyboardModifier