Repeater delegates have no parent in Component.onCompleted
authorMartin Jones <martin.jones@nokia.com>
Thu, 1 Dec 2011 03:03:31 +0000 (13:03 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 1 Dec 2011 04:43:05 +0000 (05:43 +0100)
Task-number: QTBUG-22279

Change-Id: I5c0b4a9becfee06dfc4a52e546ad81fb0b6f238a
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
src/declarative/items/qquickrepeater.cpp
src/declarative/items/qquickrepeater_p.h
tests/auto/declarative/qquickrepeater/data/initparent.qml [new file with mode: 0644]
tests/auto/declarative/qquickrepeater/tst_qquickrepeater.cpp

index f207afd..efa83ee 100644 (file)
@@ -189,6 +189,7 @@ void QQuickRepeater::setModel(const QVariant &model)
         disconnect(d->model, SIGNAL(modelUpdated(QDeclarativeChangeSet,bool)),
                 this, SLOT(modelUpdated(QDeclarativeChangeSet,bool)));
         disconnect(d->model, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(createdItem(int,QQuickItem*)));
+        disconnect(d->model, SIGNAL(initItem(int,QQuickItem*)), this, SLOT(initItem(int,QQuickItem*)));
 //        disconnect(d->model, SIGNAL(destroyingItem(QQuickItem*)), this, SLOT(destroyingItem(QQuickItem*)));
     }
     d->dataSource = model;
@@ -214,6 +215,7 @@ void QQuickRepeater::setModel(const QVariant &model)
         connect(d->model, SIGNAL(modelUpdated(QDeclarativeChangeSet,bool)),
                 this, SLOT(modelUpdated(QDeclarativeChangeSet,bool)));
         connect(d->model, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(createdItem(int,QQuickItem*)));
+        connect(d->model, SIGNAL(initItem(int,QQuickItem*)), this, SLOT(initItem(int,QQuickItem*)));
 //        connect(d->model, SIGNAL(destroyingItem(QQuickItem*)), this, SLOT(destroyingItem(QQuickItem*)));
         regenerate();
     }
@@ -397,13 +399,19 @@ void QQuickRepeaterPrivate::createItems()
     inRequest = false;
 }
 
-void QQuickRepeater::createdItem(int index, QQuickItem *item)
+void QQuickRepeater::createdItem(int, QQuickItem *)
 {
     Q_D(QQuickRepeater);
     if (!d->inRequest)
         d->createItems();
 }
 
+void QQuickRepeater::initItem(int, QQuickItem *item)
+{
+    QDeclarative_setParent_noEvent(item, parentItem());
+    item->setParentItem(parentItem());
+}
+
 void QQuickRepeater::modelUpdated(const QDeclarativeChangeSet &changeSet, bool reset)
 {
     Q_D(QQuickRepeater);
index 6da6adb..5b90d74 100644 (file)
@@ -95,6 +95,7 @@ protected:
 
 private Q_SLOTS:
     void createdItem(int index, QQuickItem *item);
+    void initItem(int, QQuickItem *item);
     void modelUpdated(const QDeclarativeChangeSet &changeSet, bool reset);
 
 private:
diff --git a/tests/auto/declarative/qquickrepeater/data/initparent.qml b/tests/auto/declarative/qquickrepeater/data/initparent.qml
new file mode 100644 (file)
index 0000000..e6571f0
--- /dev/null
@@ -0,0 +1,12 @@
+import QtQuick 2.0
+
+Item {
+    id: root
+    property Item parentItem: null
+    Repeater {
+        model: 1
+        Item {
+            Component.onCompleted: root.parentItem = parent
+        }
+    }
+}
index fc76480..6024d13 100644 (file)
@@ -76,6 +76,7 @@ private slots:
     void modelChanged();
     void properties();
     void asynchronous();
+    void initParent();
 
 private:
     QQuickView *createView();
@@ -695,6 +696,17 @@ void tst_QQuickRepeater::asynchronous()
     delete canvas;
 }
 
+void tst_QQuickRepeater::initParent()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent component(&engine, TEST_FILE("initparent.qml"));
+
+    QQuickItem *rootObject = qobject_cast<QQuickItem*>(component.create());
+    QVERIFY(rootObject);
+
+    QCOMPARE(qvariant_cast<QQuickItem*>(rootObject->property("parentItem")), rootObject);
+}
+
 QQuickView *tst_QQuickRepeater::createView()
 {
     QQuickView *canvas = new QQuickView(0);