diff --git a/examples/quick/pointerhandlers/pointerhandlers.qml b/examples/quick/pointerhandlers/pointerhandlers.qml index a5cbbbd56a..db33b961cb 100644 --- a/examples/quick/pointerhandlers/pointerhandlers.qml +++ b/examples/quick/pointerhandlers/pointerhandlers.qml @@ -83,13 +83,10 @@ Rectangle { z: 10000 anchors.fill: parent - // TODO use Instantiator to create these... but we need to be able to set their parents to glassPane somehow (QTBUG-64546) - TouchpointFeedbackSprite { } - TouchpointFeedbackSprite { } - TouchpointFeedbackSprite { } - TouchpointFeedbackSprite { } - TouchpointFeedbackSprite { } - TouchpointFeedbackSprite { } + Instantiator { + model: 10 + delegate: TouchpointFeedbackSprite { parent: glassPane } + } MouseFeedbackSprite { } } diff --git a/src/qmlmodels/qqmlinstantiator.cpp b/src/qmlmodels/qqmlinstantiator.cpp index cb7ca1126c..d7b70d20d6 100644 --- a/src/qmlmodels/qqmlinstantiator.cpp +++ b/src/qmlmodels/qqmlinstantiator.cpp @@ -128,7 +128,8 @@ void QQmlInstantiatorPrivate::_q_createdItem(int idx, QObject* item) return; if (requestedIndex != idx) // Asynchronous creation, reference the object (void)instanceModel->object(idx); - item->setParent(q); + if (!item->parent()) + item->setParent(q); if (objects.size() < idx + 1) { int modelCount = instanceModel->count(); if (objects.capacity() < modelCount) diff --git a/tests/auto/qml/qqmlinstantiator/data/handlerWithParent.qml b/tests/auto/qml/qqmlinstantiator/data/handlerWithParent.qml new file mode 100644 index 0000000000..a032b19efc --- /dev/null +++ b/tests/auto/qml/qqmlinstantiator/data/handlerWithParent.qml @@ -0,0 +1,12 @@ +import QtQuick + +Item { + id: root + Instantiator { + model: 2 + delegate: PointHandler { + objectName: "pointHandler" + parent: root + } + } +} diff --git a/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp b/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp index 4c6c84a9d2..a0ab2cda5b 100644 --- a/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp +++ b/tests/auto/qml/qqmlinstantiator/tst_qqmlinstantiator.cpp @@ -56,6 +56,8 @@ private slots: void asynchronous_data(); void asynchronous(); + + void handlerWithParent(); }; tst_qqmlinstantiator::tst_qqmlinstantiator() @@ -276,6 +278,19 @@ void tst_qqmlinstantiator::asynchronous() } } +void tst_qqmlinstantiator::handlerWithParent() +{ + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("handlerWithParent.qml")); + QObject *rootObject = component.create(); + QVERIFY(rootObject != nullptr); + const auto handlers = rootObject->findChildren("pointHandler"); + QCOMPARE(handlers.count(), 2); + for (const auto *h : handlers) { + QCOMPARE(h->parent(), rootObject); + } +} + QTEST_MAIN(tst_qqmlinstantiator) #include "tst_qqmlinstantiator.moc"