QML: do not wrap property values of type QVariant.

When reading a propety from a QGadget or a QObject, the values are
stored in a QVariant and later unwrapped/converted to the correct
JavaScript type. However, if the property value is a QVariant, it does
not need to wrap it (again) in a QVariant.

Change-Id: I633d3194f82b6032fc15d9994c4dee5e5609fd21
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
This commit is contained in:
Erik Verbruggen 2016-01-27 12:08:18 +01:00 committed by Erik Verbruggen
parent e9a6c1d4e3
commit afbfdcff3b
2 changed files with 26 additions and 2 deletions

View File

@ -357,8 +357,14 @@ ReturnedValue QQmlValueTypeWrapper::get(const Managed *m, String *name, bool *ha
VALUE_TYPE_LOAD(QMetaType::QString, QString, v4->newString);
VALUE_TYPE_LOAD(QMetaType::Bool, bool, bool);
QVariant v(result->propType, (void *)0);
void *args[] = { v.data(), 0 };
QVariant v;
void *args[] = { Q_NULLPTR, Q_NULLPTR };
if (result->propType == QMetaType::QVariant) {
args[0] = &v;
} else {
v = QVariant(result->propType, static_cast<void *>(Q_NULLPTR));
args[0] = v.data();
}
metaObject->d.static_metacall(reinterpret_cast<QObject*>(gadget), QMetaObject::ReadProperty, index, args);
return v4->fromVariant(v);
#undef VALUE_TYPE_ACCESSOR

View File

@ -1493,6 +1493,7 @@ struct MyOffice
{
Q_PROPERTY(int chairs MEMBER m_chairs)
Q_PROPERTY(MyDesk desk READ desk WRITE setDesk)
Q_PROPERTY(QVariant myThing READ myThing WRITE setMyThing)
Q_GADGET
public:
MyOffice() : m_chairs(0) {}
@ -1500,8 +1501,12 @@ public:
MyDesk desk() const { return m_desk; }
void setDesk(const MyDesk &d) { m_desk = d; }
QVariant myThing() const { return m_myThing; }
void setMyThing(const QVariant &thingy) { m_myThing = thingy; }
int m_chairs;
MyDesk m_desk;
QVariant m_myThing;
};
Q_DECLARE_METATYPE(MyOffice)
@ -1513,6 +1518,11 @@ void tst_qqmlvaluetypes::customValueType()
MyOffice cppOffice;
cppOffice.m_chairs = 2;
QVariantMap m;
m.insert(QStringLiteral("hasChair"), false);
m.insert(QStringLiteral("textOnWhiteboard"), QStringLiteral("Blah blah"));
cppOffice.m_myThing = m;
QJSValue office = engine.toScriptValue(cppOffice);
QCOMPARE(office.property("chairs").toInt(), 2);
office.setProperty("chairs", 1);
@ -1530,6 +1540,14 @@ void tst_qqmlvaluetypes::customValueType()
cppOffice = engine.fromScriptValue<MyOffice>(office);
QCOMPARE(cppOffice.m_chairs, 1);
QCOMPARE(cppOffice.desk().monitorCount, 2);
QJSValue thingy = office.property("myThing");
QVERIFY(thingy.hasProperty("hasChair"));
QVERIFY(thingy.property("hasChair").isBool());
QCOMPARE(thingy.property("hasChair").toBool(), false);
QVERIFY(thingy.property("textOnWhiteboard").isString());
QVERIFY(thingy.hasProperty("textOnWhiteboard"));
QCOMPARE(thingy.property("textOnWhiteboard").toString(), QStringLiteral("Blah blah"));
}
struct BaseGadget