From e6bafe10966f9faa649befcbee4620470ddd31ef Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 1 Dec 2011 13:03:31 +1000 Subject: [PATCH] Repeater delegates have no parent in Component.onCompleted Task-number: QTBUG-22279 Change-Id: I5c0b4a9becfee06dfc4a52e546ad81fb0b6f238a Reviewed-by: Andrew den Exter --- src/declarative/items/qquickrepeater.cpp | 10 +++++++++- src/declarative/items/qquickrepeater_p.h | 1 + .../declarative/qquickrepeater/data/initparent.qml | 12 ++++++++++++ .../qquickrepeater/tst_qquickrepeater.cpp | 12 ++++++++++++ 4 files changed, 34 insertions(+), 1 deletions(-) create mode 100644 tests/auto/declarative/qquickrepeater/data/initparent.qml diff --git a/src/declarative/items/qquickrepeater.cpp b/src/declarative/items/qquickrepeater.cpp index f207afd..efa83ee 100644 --- a/src/declarative/items/qquickrepeater.cpp +++ b/src/declarative/items/qquickrepeater.cpp @@ -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); diff --git a/src/declarative/items/qquickrepeater_p.h b/src/declarative/items/qquickrepeater_p.h index 6da6adb..5b90d74 100644 --- a/src/declarative/items/qquickrepeater_p.h +++ b/src/declarative/items/qquickrepeater_p.h @@ -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 index 0000000..e6571f0 --- /dev/null +++ b/tests/auto/declarative/qquickrepeater/data/initparent.qml @@ -0,0 +1,12 @@ +import QtQuick 2.0 + +Item { + id: root + property Item parentItem: null + Repeater { + model: 1 + Item { + Component.onCompleted: root.parentItem = parent + } + } +} diff --git a/tests/auto/declarative/qquickrepeater/tst_qquickrepeater.cpp b/tests/auto/declarative/qquickrepeater/tst_qquickrepeater.cpp index fc76480..6024d13 100644 --- a/tests/auto/declarative/qquickrepeater/tst_qquickrepeater.cpp +++ b/tests/auto/declarative/qquickrepeater/tst_qquickrepeater.cpp @@ -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(component.create()); + QVERIFY(rootObject); + + QCOMPARE(qvariant_cast(rootObject->property("parentItem")), rootObject); +} + QQuickView *tst_QQuickRepeater::createView() { QQuickView *canvas = new QQuickView(0); -- 1.7.2.5