diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index 09b735ae9ed20650c38e5c2e7ffb8d33068011f0..2a888b7a1e1ad6af6fa1757e97e3b979d24b4baf 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -1611,15 +1611,14 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, QQmlMetaObject QQmlPropertyPrivate::rawMetaObjectForType(QQmlEnginePrivate *engine, int userType) { - if (engine) { + QMetaType metaType(userType); + if ((metaType.flags() & QMetaType::PointerToQObject) && metaType.metaObject()) + return metaType.metaObject(); + if (engine) return engine->rawMetaObjectForType(userType); - } QQmlType *type = QQmlMetaType::qmlType(userType); if (type) return QQmlMetaObject(type->baseMetaObject()); - QMetaType metaType(userType); - if ((metaType.flags() & QMetaType::PointerToQObject) && metaType.metaObject()) - return metaType.metaObject(); return QQmlMetaObject((QObject*)0); } diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp index 6cd1eafafdde56c03ccd05c0b37854d9ad798b83..62ccec5794b58b12e54c1f642210893a793ed1ea 100644 --- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp +++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp @@ -1157,6 +1157,17 @@ void tst_qqmlproperty::read() QVERIFY(v.canConvert(QMetaType::QObjectStar)); QVERIFY(qvariant_cast<QObject *>(v) == o.qObject()); } + { + QQmlEngine engine; + PropertyObject o; + QQmlProperty p(&o, "qObject", &engine); + QCOMPARE(p.propertyTypeCategory(), QQmlProperty::Object); + + QCOMPARE(p.propertyType(), qMetaTypeId<MyQObject*>()); + QVariant v = p.read(); + QVERIFY(v.canConvert(QMetaType::QObjectStar)); + QVERIFY(qvariant_cast<QObject *>(v) == o.qObject()); + } // Object property { @@ -1432,6 +1443,23 @@ void tst_qqmlproperty::write() QCOMPARE(newData.value<QObject*>(), newObject); QCOMPARE(newData.value<MyQObject*>(), newObject); } + { + QQmlEngine engine; + PropertyObject o; + QQmlProperty p(&o, QString("qObject"), &engine); + QCOMPARE(o.qObject(), (QObject*)0); + QObject *newObject = new MyQObject(this); + QCOMPARE(p.write(QVariant::fromValue(newObject)), true); + QCOMPARE(o.qObject(), newObject); + QVariant data = p.read(); + QCOMPARE(data.value<QObject*>(), newObject); + QCOMPARE(data.value<MyQObject*>(), newObject); + // Incompatible types can not be written. + QCOMPARE(p.write(QVariant::fromValue(new MyQmlObject(this))), false); + QVariant newData = p.read(); + QCOMPARE(newData.value<QObject*>(), newObject); + QCOMPARE(newData.value<MyQObject*>(), newObject); + } } void tst_qqmlproperty::reset()