diff --git a/playground/parrots/Overlay.cpp b/playground/parrots/Overlay.cpp index 8f3a4dbe..ff1250d0 100644 --- a/playground/parrots/Overlay.cpp +++ b/playground/parrots/Overlay.cpp @@ -8,6 +8,8 @@ #include "SceneTexture.h" #include +#include +#include #include #include @@ -63,12 +65,16 @@ class OverlayPrivate final : public QQuickItemPrivate, public QQuickItemChangeLi QSGRootNode* grabbedNode() { - return grabbedItem ? get( grabbedItem )->rootNode() : nullptr; - } + if ( grabbedItem ) + return grabbedItem ? get( grabbedItem )->rootNode() : nullptr; - QSGTransformNode* grabbedItemNode() - { - return grabbedItem ? get( grabbedItem )->itemNode() : nullptr; + if ( auto window = q_func()->window() ) + { + if ( auto renderer = QQuickWindowPrivate::get( window )->renderer ) + return renderer->rootNode(); + } + + return nullptr; } QPointer< QQuickItem > grabbedItem; @@ -110,16 +116,19 @@ void Overlay::geometryChange( const QRectF& newGeometry, const QRectF& oldGeometry ) { Inherited::geometryChange( newGeometry, oldGeometry ); - - if ( d_func()->grabbedItem ) - update(); + update(); } QSGNode* Overlay::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* ) { Q_D( Overlay ); - if ( d->grabbedItemNode() == nullptr || size().isEmpty() ) + auto grabbedNode = d->grabbedNode(); + + if ( grabbedNode == nullptr ) + QMetaObject::invokeMethod( this, &QQuickItem::update ); + + if ( grabbedNode == nullptr || size().isEmpty() ) { delete oldNode; return nullptr; @@ -146,7 +155,7 @@ QSGNode* Overlay::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* ) auto texture = static_cast< SceneTexture* >( node->texture() ); texture->setFiltering( smooth() ? QSGTexture::Linear : QSGTexture::Nearest ); - texture->render( d->grabbedNode(), itemNode, + texture->render( grabbedNode, itemNode, QRectF( x(), y(), width(), height() ) ); itemNode->isBlocked = false; diff --git a/playground/parrots/main.cpp b/playground/parrots/main.cpp index aef022e2..1ba5b2a9 100644 --- a/playground/parrots/main.cpp +++ b/playground/parrots/main.cpp @@ -50,8 +50,6 @@ class OverlayBox : public Overlay OverlayBox( QQuickItem* parent = nullptr ) : Inherited( parent ) { - if ( parent ) - setGrabbedItem( parent ); } protected: