diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-11-04 15:19:26 +0100 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-11-15 14:41:05 +0100 |
commit | 1869615fc959c70a334e666ebf95ff595a3d6e67 (patch) | |
tree | b3940f0c18afcabd3c531f172b040a47d34c55d0 /src/plugins | |
parent | 1aec96bffdce7e835aa33f01f44269594a955548 (diff) |
QChar: make construction from integral explicit
QChar should not be convertible from any integral type except from
char16_t, short and possibly char (since it's a direct superset).
David provided the perfect example:
if (str == 123) { ~~~ }
compiles, with 123 implicitly converted to QChar (str == "123"
was meant instead). But similarly one can construct other
scenarios where QString(123) gets accidentally used (instead of
QString::number(123)), like QString s; s += 123;.
Add a macro to revert to the implicit constructors, for backwards
compatibility.
The breaks are mostly in tests that "abuse" of integers (arithmetic,
etc.). Maybe it's time for user-defined literals for QChar/QString,
but that is left for another commit.
[ChangeLog][Potentially Source-Incompatible Changes][QChar] QChar
constructors from integral types are now by default explicit.
It is recommended to use explicit conversions, QLatin1Char,
QChar::fromUcs4 instead of implicit conversions. The old behavior
can be restored by defining the QT_IMPLICIT_QCHAR_CONSTRUCTION
macro.
Change-Id: I6175f6ab9bcf1956f6f97ab0c9d9d5aaf777296d
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoakeymapper.mm | 26 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenuitem.mm | 2 | ||||
-rw-r--r-- | src/plugins/styles/mac/qmacstyle_mac.mm | 2 |
3 files changed, 15 insertions, 15 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.mm b/src/plugins/platforms/cocoa/qcocoakeymapper.mm index dca7b576f6..caa68ae694 100644 --- a/src/plugins/platforms/cocoa/qcocoakeymapper.mm +++ b/src/plugins/platforms/cocoa/qcocoakeymapper.mm @@ -121,7 +121,7 @@ static CarbonModifiers toCarbonModifiers(Qt::KeyboardModifiers qtModifiers) } // Keyboard keys (non-modifiers) -static QHash<QChar, Qt::Key> standardKeys = { +static QHash<char16_t, Qt::Key> standardKeys = { { kHomeCharCode, Qt::Key_Home }, { kEnterCharCode, Qt::Key_Enter }, { kEndCharCode, Qt::Key_End }, @@ -173,7 +173,7 @@ static QHash<QChar, Qt::Key> standardKeys = { { '^', Qt::Key_AsciiCircum } }; -static QHash<QChar, Qt::Key> virtualKeys = { +static QHash<char16_t, Qt::Key> virtualKeys = { { kVK_F1, Qt::Key_F1 }, { kVK_F2, Qt::Key_F2 }, { kVK_F3, Qt::Key_F3 }, @@ -202,7 +202,7 @@ static QHash<QChar, Qt::Key> virtualKeys = { { kVK_PageDown, Qt::Key_PageDown } }; -static QHash<QChar, Qt::Key> functionKeys = { +static QHash<char16_t, Qt::Key> functionKeys = { { NSUpArrowFunctionKey, Qt::Key_Up }, { NSDownArrowFunctionKey, Qt::Key_Down }, { NSLeftArrowFunctionKey, Qt::Key_Left }, @@ -237,7 +237,7 @@ static int toKeyCode(const QChar &key, int virtualKey, int modifiers) qCDebug(lcQpaKeyMapperKeys, "Mapping key: %d (0x%04x) / vk %d (0x%04x)", key.unicode(), key.unicode(), virtualKey, virtualKey); - if (key == kClearCharCode && virtualKey == 0x47) + if (key == QChar(kClearCharCode) && virtualKey == 0x47) return Qt::Key_Clear; if (key.isDigit()) { @@ -254,7 +254,7 @@ static int toKeyCode(const QChar &key, int virtualKey, int modifiers) return key.unicode(); } - if (auto qtKey = standardKeys.value(key)) { + if (auto qtKey = standardKeys.value(key.unicode())) { // To work like Qt for X11 we issue Backtab when Shift + Tab are pressed if (qtKey == Qt::Key_Tab && (modifiers & Qt::ShiftModifier)) { qCDebug(lcQpaKeyMapperKeys, "Got key: Qt::Key_Backtab"); @@ -272,11 +272,11 @@ static int toKeyCode(const QChar &key, int virtualKey, int modifiers) } // Check if they belong to key codes in private unicode range - if (key >= NSUpArrowFunctionKey && key <= NSModeSwitchFunctionKey) { - if (auto qtKey = functionKeys.value(key)) { + if (key >= QChar(NSUpArrowFunctionKey) && key <= QChar(NSModeSwitchFunctionKey)) { + if (auto qtKey = functionKeys.value(key.unicode())) { qCDebug(lcQpaKeyMapperKeys) << "Got" << qtKey; return qtKey; - } else if (key >= NSF1FunctionKey && key <= NSF35FunctionKey) { + } else if (key >= QChar(NSF1FunctionKey) && key <= QChar(NSF35FunctionKey)) { auto functionKey = Qt::Key_F1 + (key.unicode() - NSF1FunctionKey) ; qCDebug(lcQpaKeyMapperKeys) << "Got" << functionKey; return functionKey; @@ -291,7 +291,7 @@ static int toKeyCode(const QChar &key, int virtualKey, int modifiers) static const int NSEscapeCharacter = 27; // not defined by Cocoa headers -static const QHash<QChar, Qt::Key> cocoaKeys = { +static const QHash<char16_t, Qt::Key> cocoaKeys = { { NSEnterCharacter, Qt::Key_Enter }, { NSBackspaceCharacter, Qt::Key_Backspace }, { NSTabCharacter, Qt::Key_Tab }, @@ -357,11 +357,11 @@ QChar QCocoaKeyMapper::toCocoaKey(Qt::Key key) { // Prioritize overloaded keys if (key == Qt::Key_Return) - return NSNewlineCharacter; + return QChar(NSNewlineCharacter); if (key == Qt::Key_Backspace) - return NSBackspaceCharacter; + return QChar(NSBackspaceCharacter); - static QHash<Qt::Key, QChar> reverseCocoaKeys; + static QHash<Qt::Key, char16_t> reverseCocoaKeys; if (reverseCocoaKeys.isEmpty()) { reverseCocoaKeys.reserve(cocoaKeys.size()); for (auto it = cocoaKeys.begin(); it != cocoaKeys.end(); ++it) @@ -373,7 +373,7 @@ QChar QCocoaKeyMapper::toCocoaKey(Qt::Key key) Qt::Key QCocoaKeyMapper::fromCocoaKey(QChar keyCode) { - if (auto key = cocoaKeys.value(keyCode)) + if (auto key = cocoaKeys.value(keyCode.unicode())) return key; return Qt::Key(keyCode.toUpper().unicode()); diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm index 511c72988a..4806b244c3 100644 --- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm +++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm @@ -362,7 +362,7 @@ NSMenuItem *QCocoaMenuItem::sync() // Similar to qt_mac_removePrivateUnicode change the delete key, // so the symbol is correctly seen in native menu bar. if (cocoaKey.unicode() == NSDeleteFunctionKey) - cocoaKey = NSDeleteCharacter; + cocoaKey = QChar(NSDeleteCharacter); m_native.keyEquivalent = QStringView(&cocoaKey, 1).toNSString(); m_native.keyEquivalentModifierMask = QCocoaKeyMapper::toCocoaModifiers(modifiers); diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm index 34568ee44a..8c3c6f4413 100644 --- a/src/plugins/styles/mac/qmacstyle_mac.mm +++ b/src/plugins/styles/mac/qmacstyle_mac.mm @@ -676,7 +676,7 @@ static inline bool isTreeView(const QWidget *widget) static QString qt_mac_removeMnemonics(const QString &original) { - QString returnText(original.size(), 0); + QString returnText(original.size(), QChar(0)); int finalDest = 0; int currPos = 0; int l = original.length(); |