diff --git a/src/gui/qgssnapindicator.cpp b/src/gui/qgssnapindicator.cpp index 448f2cf16f57..03b6dc5e7929 100644 --- a/src/gui/qgssnapindicator.cpp +++ b/src/gui/qgssnapindicator.cpp @@ -27,9 +27,23 @@ QgsSnapIndicator::QgsSnapIndicator( QgsMapCanvas *canvas ) : mCanvas( canvas ) { + mCanvasDestroyedConnection = QObject::connect( canvas, &QgsMapCanvas::destroyed, [ = ]() + { + mCanvas = nullptr; + mSnappingMarker = nullptr; + } ); } -QgsSnapIndicator::~QgsSnapIndicator() = default; +QgsSnapIndicator::~QgsSnapIndicator() +{ + if ( mSnappingMarker && mCanvas ) + { + mCanvas->scene()->removeItem( mSnappingMarker ); + delete mSnappingMarker; + } + + QObject::disconnect( mCanvasDestroyedConnection ); +}; void QgsSnapIndicator::setMatch( const QgsPointLocator::Match &match ) { @@ -37,14 +51,19 @@ void QgsSnapIndicator::setMatch( const QgsPointLocator::Match &match ) if ( !mMatch.isValid() ) { - mSnappingMarker.reset(); + if ( mSnappingMarker ) + { + mCanvas->scene()->removeItem( mSnappingMarker ); + delete mSnappingMarker; // need to delete since QGraphicsSene::removeItem transfers back ownership + } + mSnappingMarker = nullptr; QToolTip::hideText(); } else { if ( !mSnappingMarker ) { - mSnappingMarker.reset( new QgsVertexMarker( mCanvas ) ); + mSnappingMarker = new QgsVertexMarker( mCanvas ); // ownership of the marker is transferred to QGraphicsScene mSnappingMarker->setIconSize( QgsGuiUtils::scaleIconSize( 10 ) ); mSnappingMarker->setPenWidth( QgsGuiUtils::scaleIconSize( 3 ) ); } diff --git a/src/gui/qgssnapindicator.h b/src/gui/qgssnapindicator.h index 218e4b565e63..5251244d72f7 100644 --- a/src/gui/qgssnapindicator.h +++ b/src/gui/qgssnapindicator.h @@ -56,7 +56,8 @@ class GUI_EXPORT QgsSnapIndicator QgsMapCanvas *mCanvas; QgsPointLocator::Match mMatch; - std::unique_ptr mSnappingMarker; + QgsVertexMarker *mSnappingMarker = nullptr; + QMetaObject::Connection mCanvasDestroyedConnection; }; #endif // QGSSNAPINDICATOR_H