diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2022-10-25 07:48:13 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2022-10-27 17:23:54 +0200 |
commit | de7fc9d250db39185151b0a100519800f42556fd (patch) | |
tree | d50694b76fd075b096551eacd04f90ea88c095e2 /tests | |
parent | dc5407c095e2e64358d09f2558705f4cc37a5767 (diff) |
Quick3DNodeInstantiator: fix crash when using async
Something in the asynchronous creation of elements in QtQuick has been changed
leading to elements of the instantiator being created out of order.
QQmlInstantiator and friends had been updated at the time when the QtQuick changes
were made but Quick3DNodeInstantiator was left out.
This patch incorporate changes that have been made into QQmlInstantiator
to correct out of order node creation.
Task-number: QTBUG-56368
Pick-to: 6.4 6.2 5.15
Change-Id: I2aa7499e6dc08be329cd42ded7377acd4088e0c7
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml | 13 | ||||
-rw-r--r-- | tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp | 45 |
2 files changed, 58 insertions, 0 deletions
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml new file mode 100644 index 000000000..be6c46582 --- /dev/null +++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml @@ -0,0 +1,13 @@ +import QtQml 2.1 +import Qt3D.Core 2.0 + +Entity { + NodeInstantiator { + model: 10 + asynchronous: true + delegate: Entity { + property bool success: true + property int idx: index + } + } +} diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp index e7037bce8..4dad12049 100644 --- a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp +++ b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp @@ -14,6 +14,7 @@ #include <QtQml/qqmlengine.h> #include <QtQml/qqmlcomponent.h> #include <QtQml/qqmlcontext.h> +#include <QtQml/qqmlincubator.h> using namespace Qt3DCore::Quick; @@ -30,6 +31,8 @@ private slots: void activeProperty(); void intModelChange(); void createAndRemove(); + void asynchronous_data(); + void asynchronous(); }; void tst_quick3dnodeinstantiator::createNone() @@ -225,6 +228,48 @@ void tst_quick3dnodeinstantiator::createAndRemove() QCOMPARE(object->property("datum").toString(), names[i]); } } + +void tst_quick3dnodeinstantiator::asynchronous_data() +{ + QTest::addColumn<bool>("asyncIncubator"); + QTest::addColumn<QString>("fileName"); + + QTest::newRow("Asynchronous Instantiator") << false << "createMultipleAsync.qml"; + QTest::newRow("Nested-asynchronous Instantiator") << true << "createMultiple.qml"; +} + +void tst_quick3dnodeinstantiator::asynchronous() +{ + QFETCH(bool, asyncIncubator); + QFETCH(QString, fileName); + + QQmlEngine engine; + QQmlIncubationController incubationController; + engine.setIncubationController(&incubationController); + QQmlComponent component(&engine, testFileUrl(fileName)); + QQmlIncubator incubator(asyncIncubator ? QQmlIncubator::Asynchronous : QQmlIncubator::Synchronous); + component.create(incubator); + while (!incubator.isReady()) + incubationController.incubateFor(10); + QObject *rootObject = incubator.object(); + QVERIFY(rootObject != nullptr); + while (incubationController.incubatingObjectCount() > 0) + incubationController.incubateFor(10); + Quick3DNodeInstantiator *instantiator = rootObject->findChild<Quick3DNodeInstantiator *>(); + QVERIFY(instantiator != nullptr); + QCOMPARE(instantiator->isActive(), true); + QCOMPARE(instantiator->count(), 10); + + for (int i=0; i<10; i++) { + QObject *object = instantiator->objectAt(i); + QVERIFY(object); + QCOMPARE(object->parent(), rootObject); + QCOMPARE(object->property("success").toBool(), true); + QCOMPARE(object->property("idx").toInt(), i); + } +} + + QTEST_MAIN(tst_quick3dnodeinstantiator) #include "tst_quick3dnodeinstantiator.moc" |