QKeyCombination: move the operators into namespace Qt
QKeyCombination comes with a few operators that combine a Qt::Modifier
and a Qt::Key. These operators are normally defined in Qt's own
namespace (which by default is the global namespace), but indeed the
arguments are declared in the (nested) namespace `Qt`. This is wrong,
as their lookup will fail if a user places an unrelated operator| in
a custom namespace U and then tries to use QKeyCombination's operators:
the overload in namespace U will hide the ones defined globally;
unqualified lookup (as per [over.match.oper]) will search in the
namespaces associated with the parameters (QtNamespace::Qt), but the
operators are *not* in there!
In other words:
namespace NS {
X operator|(Y, Z);
auto kc = Qt::Shift | Qt::Key_A;
}
fails to compile if QKeyCombination's operator| is *not* defined in the
`Qt` namespace.
Fix this by indeed defining the operator where it belongs. The functions
are all inline and non-exported so there should not be any ABI issues.
Change-Id: I6d7a4e976fb109b7bf514011142b9a9573e507c5
Pick-to: 6.7 6.5 6.2
Fixes: QTBUG-126820
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit 1f77e8566f71d98f4bc6bbf5092594e67a32f268)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
bb10
parent
f209e81d0f
commit
6e2c9dc7a6
|
|
@ -1925,6 +1925,7 @@ private:
|
|||
|
||||
Q_DECLARE_TYPEINFO(QKeyCombination, Q_RELOCATABLE_TYPE);
|
||||
|
||||
namespace Qt {
|
||||
constexpr QKeyCombination operator|(Qt::Modifier modifier, Qt::Key key) noexcept
|
||||
{
|
||||
return QKeyCombination(modifier, key);
|
||||
|
|
@ -2014,6 +2015,7 @@ constexpr QKeyCombination operator+(Qt::Key key, Qt::KeyboardModifiers modifiers
|
|||
return QKeyCombination(modifiers, key);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
|
|
|||
|
|
@ -3512,10 +3512,10 @@
|
|||
*/
|
||||
|
||||
/*!
|
||||
\fn QKeyCombination operator|(Qt::Modifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator|(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator|(Qt::Key key, Qt::Modifier modifier) noexcept
|
||||
\fn QKeyCombination operator|(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::Modifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::Key key, Qt::Modifier modifier) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
|
||||
|
||||
\relates QKeyCombination
|
||||
|
||||
|
|
@ -3524,10 +3524,10 @@
|
|||
*/
|
||||
|
||||
/*!
|
||||
\fn QKeyCombination operator|(Qt::Modifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator|(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator|(Qt::Key key, Qt::Modifiers modifiers) noexcept
|
||||
\fn QKeyCombination operator|(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::Modifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::Key key, Qt::Modifiers modifiers) noexcept
|
||||
\fn QKeyCombination Qt::operator|(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
|
||||
|
||||
\relates QKeyCombination
|
||||
|
||||
|
|
@ -3536,10 +3536,10 @@
|
|||
*/
|
||||
|
||||
/*!
|
||||
\fn QKeyCombination operator+(Qt::Modifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator+(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator+(Qt::Key key, Qt::Modifier modifier) noexcept
|
||||
\fn QKeyCombination operator+(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::Modifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::KeyboardModifier modifier, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::Key key, Qt::Modifier modifier) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::Key key, Qt::KeyboardModifier modifier) noexcept
|
||||
|
||||
\relates QKeyCombination
|
||||
\deprecated
|
||||
|
|
@ -3551,10 +3551,10 @@
|
|||
*/
|
||||
|
||||
/*!
|
||||
\fn QKeyCombination operator+(Qt::Modifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator+(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination operator+(Qt::Key key, Qt::Modifiers modifiers) noexcept
|
||||
\fn QKeyCombination operator+(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::Modifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::KeyboardModifiers modifiers, Qt::Key key) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::Key key, Qt::Modifiers modifiers) noexcept
|
||||
\fn QKeyCombination Qt::operator+(Qt::Key key, Qt::KeyboardModifiers modifiers) noexcept
|
||||
|
||||
\relates QKeyCombination
|
||||
\deprecated
|
||||
|
|
|
|||
|
|
@ -274,6 +274,17 @@ void tst_QKeyCombination::operator_or()
|
|||
QCOMPARE(Qt::ControlModifier | Qt::Key_Escape, QKeyCombination(Qt::ControlModifier, Qt::Key_Escape));
|
||||
}
|
||||
|
||||
namespace QTBUG_126820 {
|
||||
struct S {};
|
||||
S operator|(S, S);
|
||||
S operator+(S, S);
|
||||
|
||||
[[maybe_unused]] constexpr QKeyCombination kc1 = Qt::SHIFT | Qt::Key_A;
|
||||
#if QT_DEPRECATED_SINCE(6, 0)
|
||||
[[maybe_unused]] constexpr QKeyCombination kc2 = Qt::SHIFT + Qt::Key_A;
|
||||
#endif
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QKeyCombination)
|
||||
|
||||
#include "tst_qkeycombination.moc"
|
||||
|
|
|
|||
Loading…
Reference in New Issue