diff --git a/src/shadowedrectangle.h b/src/shadowedrectangle.h --- a/src/shadowedrectangle.h +++ b/src/shadowedrectangle.h @@ -158,9 +158,11 @@ void componentComplete() override; protected: + void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value); QSGNode *updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *data) override; private: + void checkSoftwareItem(); const std::unique_ptr m_border; const std::unique_ptr m_shadow; qreal m_radius = 0.0; diff --git a/src/shadowedrectangle.cpp b/src/shadowedrectangle.cpp --- a/src/shadowedrectangle.cpp +++ b/src/shadowedrectangle.cpp @@ -172,7 +172,12 @@ { QQuickItem::componentComplete(); - if (window()->rendererInterface()->graphicsApi() == QSGRendererInterface::Software) { + checkSoftwareItem(); +} + +void ShadowedRectangle::checkSoftwareItem() +{ + if (!m_softwareItem && window() && window()->rendererInterface()->graphicsApi() == QSGRendererInterface::Software) { m_softwareItem = new PaintedRectangleItem{this}; auto updateItem = [this]() { @@ -198,6 +203,13 @@ } } +void ShadowedRectangle::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) +{ + if (change == QQuickItem::ItemSceneChange && value.window) { + checkSoftwareItem(); + } +} + QSGNode *ShadowedRectangle::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *data) { Q_UNUSED(data);