diff options
5 files changed, 60 insertions, 0 deletions
diff --git a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp index c6e8aa7c1..b99f6ae75 100644 --- a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp +++ b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp @@ -245,6 +245,7 @@ void Quick3DNodeInstantiatorPrivate::makeModel() Quick3DNodeInstantiator::Quick3DNodeInstantiator(QNode *parent) : QNode(*new Quick3DNodeInstantiatorPrivate, parent) { + connect(this, &QNode::parentChanged, this, &Quick3DNodeInstantiator::onParentChanged); } /*! @@ -501,6 +502,17 @@ void Quick3DNodeInstantiator::componentComplete() } } +/*! + \internal +*/ +void Quick3DNodeInstantiator::onParentChanged(QObject *parent) +{ + Q_D(const Quick3DNodeInstantiator); + auto parentNode = static_cast<QNode *>(parent); + for (auto obj : d->m_objects) + static_cast<QNode *>(obj.data())->setParent(parentNode); +} + // TODO: Avoid cloning here //void Quick3DNodeInstantiator::copy(const QNode *ref) //{ diff --git a/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h b/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h index fd7a1d83d..a79cb4f90 100644 --- a/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h +++ b/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h @@ -113,6 +113,9 @@ Q_SIGNALS: void objectAdded(int index, QObject *object); void objectRemoved(int index, QObject *object); +private slots: + void onParentChanged(QObject *parent); + private: Q_DISABLE_COPY(Quick3DNodeInstantiator) Q_DECLARE_PRIVATE(Quick3DNodeInstantiator) diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml new file mode 100644 index 000000000..55be54297 --- /dev/null +++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml @@ -0,0 +1,15 @@ +import QtQml 2.1 +import Qt3D.Core 2.0 + +Entity { + NodeInstantiator { + model: 3 + delegate: NodeInstantiator { + model: 4 + delegate: Entity { + property bool success: true + property int idx: index + } + } + } +} diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro b/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro index 15435d13e..9026f91ff 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro +++ b/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro @@ -12,6 +12,7 @@ OTHER_FILES = \ data/createMultiple.qml \ data/createNone.qml \ data/createSingle.qml \ + data/createNested.qml \ data/inactive.qml \ data/stringModel.qml diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp index acaba6690..d4d0d56e2 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp +++ b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp @@ -50,6 +50,7 @@ private slots: void createNone(); void createSingle(); void createMultiple(); + void createNested(); void stringModel(); void activeProperty(); void intModelChange(); @@ -109,6 +110,34 @@ void tst_quick3dnodeinstantiator::createMultiple() } } +void tst_quick3dnodeinstantiator::createNested() +{ + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("createNested.qml")); + const auto root = qobject_cast<Qt3DCore::QNode*>(component.create()); + QVERIFY(root != 0); + + auto instantiators = root->findChildren<Quick3DNodeInstantiator*>(); + QCOMPARE(instantiators.count(), 4); + + const auto outerInstantiator = instantiators.takeFirst(); + QCOMPARE(outerInstantiator->isActive(), true); + QCOMPARE(outerInstantiator->count(), 3); + + for (const auto instantiator : instantiators) { + QCOMPARE(instantiator->isActive(), true); + QCOMPARE(instantiator->count(), 4); + + for (int i = 0; i < 4; i++) { + auto object = instantiator->objectAt(i); + QVERIFY(object); + QCOMPARE(object->parent(), root); + QCOMPARE(object->property("success").toBool(), true); + QCOMPARE(object->property("idx").toInt(), i); + } + } +} + void tst_quick3dnodeinstantiator::stringModel() { QQmlEngine engine; |