diff options
author | Fawzi Mohamed <fawzi.mohamed@qt.io> | 2020-08-20 13:16:45 +0200 |
---|---|---|
committer | Fawzi Mohamed <fawzi.mohamed@qt.io> | 2020-08-20 15:02:25 +0200 |
commit | f04497b5d24e908beb50dff04b0a03358d7993c7 (patch) | |
tree | d6042cbf0aac5a7520ac33ac2fb89d0bcc7c0062 /src | |
parent | c1f8a72a43c7487e4ee6952c67269573664d2463 (diff) |
Weak compare for value types in QML
QPoint, QPointF, QRect, QRectF,... are basically equivalent in QML JS
where int and double are stored as double, but QVariant now has a
stricter equality comparison, which breaks code.
Make QQmlValueTypeWrapper::isEqual perform the weaker comparison.
This fixes a regression in tst_qqmlvaluetypes and
tst_qqmlvaluetypeproviders which blocked CI.
Change-Id: I0fe1cab17092190ff6cf2a01310943d72d932073
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 846090278d..cfd9374b8a 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -54,6 +54,10 @@ #include <private/qv4identifiertable_p.h> #include <private/qv4lookup_p.h> #include <QtCore/qloggingcategory.h> +#include <QtCore/QLine> +#include <QtCore/QLineF> +#include <QtCore/QSize> +#include <QtCore/QSizeF> QT_BEGIN_NAMESPACE @@ -312,7 +316,49 @@ bool QQmlValueTypeWrapper::isEqual(const QVariant& value) const if (const QQmlValueTypeReference *ref = as<const QQmlValueTypeReference>()) if (!ref->readReferenceValue()) return false; - return (value == d()->toVariant()); + int id1 = value.metaType().id(); + QVariant v = d()->toVariant(); + int id2 = v.metaType().id(); + if (id1 != id2) { + // conversions for weak comparison + switch (id1) { + case QMetaType::QPoint: + if (id2 == QMetaType::QPointF) + return value.value<QPointF>() == v.value<QPointF>(); + break; + case QMetaType::QPointF: + if (id2 == QMetaType::QPoint) + return value.value<QPointF>() == v.value<QPointF>(); + break; + case QMetaType::QRect: + if (id2 == QMetaType::QRectF) + return value.value<QRectF>() == v.value<QRectF>(); + break; + case QMetaType::QRectF: + if (id2 == QMetaType::QRect) + return value.value<QRectF>() == v.value<QRectF>(); + break; + case QMetaType::QLine: + if (id2 == QMetaType::QLineF) + return value.value<QLineF>() == v.value<QLineF>(); + break; + case QMetaType::QLineF: + if (id2 == QMetaType::QLine) + return value.value<QLineF>() == v.value<QLineF>(); + break; + case QMetaType::QSize: + if (id2 == QMetaType::QSizeF) + return value.value<QSizeF>() == v.value<QSizeF>(); + break; + case QMetaType::QSizeF: + if (id2 == QMetaType::QSize) + return value.value<QSizeF>() == v.value<QSizeF>(); + break; + default: + break; + } + } + return (value == v); } int QQmlValueTypeWrapper::typeId() const |