aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFawzi Mohamed <fawzi.mohamed@qt.io>2020-08-20 13:16:45 +0200
committerFawzi Mohamed <fawzi.mohamed@qt.io>2020-08-20 15:02:25 +0200
commitf04497b5d24e908beb50dff04b0a03358d7993c7 (patch)
treed6042cbf0aac5a7520ac33ac2fb89d0bcc7c0062 /src
parentc1f8a72a43c7487e4ee6952c67269573664d2463 (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.cpp48
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