From 1869615fc959c70a334e666ebf95ff595a3d6e67 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Wed, 4 Nov 2020 15:19:26 +0100 Subject: QChar: make construction from integral explicit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/cocoa/qcocoakeymapper.mm | 26 +++++++++++++------------- src/plugins/platforms/cocoa/qcocoamenuitem.mm | 2 +- src/plugins/styles/mac/qmacstyle_mac.mm | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) (limited to 'src/plugins') 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 standardKeys = { +static QHash standardKeys = { { kHomeCharCode, Qt::Key_Home }, { kEnterCharCode, Qt::Key_Enter }, { kEndCharCode, Qt::Key_End }, @@ -173,7 +173,7 @@ static QHash standardKeys = { { '^', Qt::Key_AsciiCircum } }; -static QHash virtualKeys = { +static QHash virtualKeys = { { kVK_F1, Qt::Key_F1 }, { kVK_F2, Qt::Key_F2 }, { kVK_F3, Qt::Key_F3 }, @@ -202,7 +202,7 @@ static QHash virtualKeys = { { kVK_PageDown, Qt::Key_PageDown } }; -static QHash functionKeys = { +static QHash 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 cocoaKeys = { +static const QHash 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 reverseCocoaKeys; + static QHash 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(); -- cgit v1.2.3