Fix QQmlProperty to work correctly with deeply nested objects.
authorMichael Brasser <mbrasser@ford.com>
Fri, 12 Dec 2014 03:18:00 +0000 (21:18 -0600)
committerMichael Brasser <michael.brasser@live.com>
Mon, 22 Dec 2014 23:58:51 +0000 (00:58 +0100)
Don't keep reusing the top-level object to look up nested properties.
This allows code such as the following to work correctly:

PropertyChanges {
    target: myObject
    textChild.font.pixelSize: 24
}

Change-Id: I39e52dbc20d2409fc756a36e668fcf664eb1905f
Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/qml/qqmlproperty.cpp
tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp

index 0ee8f94..b852083 100644 (file)
@@ -276,7 +276,7 @@ void QQmlPropertyPrivate::initProperty(QObject *obj, const QString &name)
 
         QQmlPropertyData local;
         QQmlPropertyData *property =
-            QQmlPropertyCache::property(engine, obj, pathName, context, local);
+            QQmlPropertyCache::property(engine, currentObject, pathName, context, local);
 
         if (!property) return; // Not a property
         if (property->isFunction())
index 62ccec5..ed09e6d 100644 (file)
 class MyQmlObject : public QObject
 {
     Q_OBJECT
+    Q_PROPERTY(QPoint pointProperty MEMBER m_point)
 public:
     MyQmlObject(QObject *parent = 0) : QObject(parent) {}
+
+private:
+    QPoint m_point;
 };
 
 QML_DECLARE_TYPE(MyQmlObject);
@@ -141,6 +145,7 @@ private slots:
     void assignEmptyVariantMap();
     void warnOnInvalidBinding();
     void registeredCompositeTypeProperty();
+    void deeplyNestedObject();
 
     void copy();
 private:
@@ -1938,6 +1943,16 @@ void tst_qqmlproperty::warnOnInvalidBinding()
     delete obj;
 }
 
+void tst_qqmlproperty::deeplyNestedObject()
+{
+    PropertyObject o;
+    QQmlProperty p(&o, "qmlObject.pointProperty.x");
+    QCOMPARE(p.isValid(), true);
+
+    p.write(14);
+    QCOMPARE(p.read(), QVariant(14));
+}
+
 void tst_qqmlproperty::initTestCase()
 {
     QQmlDataTest::initTestCase();