diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index db4199b64a1..ce2cfbf46c6 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -419,7 +419,7 @@ QImage Qt5NodeInstanceServer::grabWindow() return {}; } -static bool hasEffect(QQuickItem *item) +bool Qt5NodeInstanceServer::hasEffect(QQuickItem *item) { QQuickItemPrivate *pItem = QQuickItemPrivate::get(item); return pItem && pItem->layer() && pItem->layer()->enabled() && pItem->layer()->effect(); diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h index d684046fc5b..b1c7ca6df0b 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h @@ -49,6 +49,7 @@ public: bool renderWindow() override; static QQuickItem *parentEffectItem(QQuickItem *item); + static bool hasEffect(QQuickItem *item); protected: void initializeView() override; diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp index 0f0536ff0d3..3a7882871c5 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp @@ -57,6 +57,7 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() if (quickWindow() && nodeInstanceClient()->bytesToWrite() < 10000) { bool windowDirty = false; bool hasView3D = false; + QList effectItems; for (QQuickItem *item : allItems()) { if (item) { if (Internal::QuickItemNodeInstance::unifiedRenderPath()) { @@ -73,6 +74,8 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() } m_dirtyInstanceSet.insert(instanceForObject(item)); } + if (hasEffect(item)) + effectItems.append(instanceForObject(item)); if (QQuickItem *effectParent = parentEffectItem(item)) { if ((QQuickDesignerSupport::isDirty( item, @@ -107,6 +110,12 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() } else { if (!m_dirtyInstanceSet.isEmpty()) { auto renderList = QtHelpers::toList(m_dirtyInstanceSet); + for (auto &effectItem : std::as_const(effectItems)) { + // Ensure effect items are rendered last + if (m_dirtyInstanceSet.contains(effectItem)) + renderList.removeOne(effectItem); + renderList.append(effectItem); + } // If there is a View3D to be rendered, add all other View3Ds to be rendered // as well, in case they share materials.