do not hold a pointer to an QGraphicsItem within a QGraphicsItem

since map canvas is deleting them all, this is causing a crash when trying to delete the already deleted item in the parent item
This commit is contained in:
Denis Rouzaud 2019-06-19 16:19:06 +02:00
parent 9c76524da7
commit 6dfe113d67
5 changed files with 18 additions and 20 deletions

View File

@ -10,6 +10,7 @@
class QgsAdvancedDigitizingCanvasItem : QgsMapCanvasItem
{
%Docstring
@ -25,8 +26,6 @@ The QgsAdvancedDigitizingCanvasItem class draws the graphical elements of the CA
virtual void paint( QPainter *painter );
protected:
};
/************************************************************************

View File

@ -28,7 +28,6 @@ QgsAdvancedDigitizingCanvasItem::QgsAdvancedDigitizingCanvasItem( QgsMapCanvas *
, mSnapPen( QPen( QColor( 127, 0, 0, 150 ), 1 ) )
, mSnapLinePen( QPen( QColor( 127, 0, 0, 150 ), 1, Qt::DashLine ) )
, mCursorPen( QPen( QColor( 127, 127, 127, 255 ), 1 ) )
, mSnapIndicator( qgis::make_unique< QgsSnapIndicator>( canvas ) )
, mAdvancedDigitizingDockWidget( cadDockWidget )
{
}
@ -253,15 +252,4 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
painter->drawLine( curPointPix + QPointF( -5, +5 ),
curPointPix + QPointF( +5, -5 ) );
}
QgsPointLocator::Match match = mAdvancedDigitizingDockWidget->mapPointMatch();
if ( match.isValid() )
{
mSnapIndicator->setMatch( match );
mSnapIndicator->setVisible( true );
}
else
mSnapIndicator->setVisible( false );
}

View File

@ -20,7 +20,7 @@
#include "qgsmapcanvasitem.h"
#include "qgis_gui.h"
#include "qgssnapindicator.h"
class QgsAdvancedDigitizingDockWidget;
@ -35,17 +35,13 @@ class GUI_EXPORT QgsAdvancedDigitizingCanvasItem : public QgsMapCanvasItem
void paint( QPainter *painter ) override;
protected:
private:
QPen mLockedPen;
QPen mConstruction1Pen;
QPen mConstruction2Pen;
QPen mSnapPen;
QPen mSnapLinePen;
QPen mCursorPen;
//! Snapping indicators
std::unique_ptr<QgsSnapIndicator> mSnapIndicator;
private:
QgsAdvancedDigitizingDockWidget *mAdvancedDigitizingDockWidget = nullptr;
};

View File

@ -42,6 +42,7 @@
QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas *canvas, QWidget *parent )
: QgsDockWidget( parent )
, mMapCanvas( canvas )
, mSnapIndicator( qgis::make_unique< QgsSnapIndicator>( canvas ) )
, mCommonAngleConstraint( QgsSettings().value( QStringLiteral( "/Cad/CommonAngle" ), 90 ).toDouble() )
{
setupUi( this );
@ -670,6 +671,17 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent *e )
e->setMapPoint( point );
mSnapMatch = context.snappingUtils->snapToMap( point );
if ( mSnapMatch.isValid() )
{
mSnapIndicator->setMatch( mSnapMatch );
mSnapIndicator->setVisible( true );
}
else
{
mSnapIndicator->setVisible( false );
}
/*
* Constraints are applied in 2D, they are always called when using the tool
* but they do not take into account if when you snap on a vertex it has

View File

@ -28,6 +28,7 @@
#include "qgsmessagebaritem.h"
#include "qgspointxy.h"
#include "qgspointlocator.h"
#include "qgssnapindicator.h"
class QgsAdvancedDigitizingCanvasItem;
@ -702,6 +703,8 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private
QgsMapCanvas *mMapCanvas = nullptr;
QgsAdvancedDigitizingCanvasItem *mCadPaintItem = nullptr;
//! Snapping indicator
std::unique_ptr<QgsSnapIndicator> mSnapIndicator;
CadCapacities mCapacities = nullptr;