Skip to content

Commit 5b0bfc6

Browse files
committedSep 29, 2015
Fix crashing rule-based labeling with data-defined properties (fixes #13416)
This code has been funded by Tuscany Region (Italy) - SITA (CIG: 63526840AE) and commissioned to Gis3W s.a.s.
1 parent 7e61616 commit 5b0bfc6

File tree

3 files changed

+26
-11
lines changed

3 files changed

+26
-11
lines changed
 

‎src/core/qgspallabeling.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,14 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s )
332332
, showingShadowRects( false )
333333
, expression( NULL )
334334
{
335+
*this = s;
336+
}
337+
338+
QgsPalLayerSettings& QgsPalLayerSettings::operator=( const QgsPalLayerSettings & s )
339+
{
340+
if ( this == &s )
341+
return *this;
342+
335343
// copy only permanent stuff
336344

337345
enabled = s.enabled;
@@ -461,12 +469,17 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s )
461469
shadowBlendMode = s.shadowBlendMode;
462470

463471
// data defined
464-
dataDefinedProperties = s.dataDefinedProperties;
472+
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator it = s.dataDefinedProperties.constBegin();
473+
for ( ; it != s.dataDefinedProperties.constEnd(); ++it )
474+
{
475+
dataDefinedProperties.insert( it.key(), it.value() ? new QgsDataDefined( *it.value() ) : 0 );
476+
}
465477
mDataDefinedNames = s.mDataDefinedNames;
466478

467479
// scale factors
468480
vectorScaleFactor = s.vectorScaleFactor;
469481
rasterCompressFactor = s.rasterCompressFactor;
482+
return *this;
470483
}
471484

472485

@@ -478,7 +491,13 @@ QgsPalLayerSettings::~QgsPalLayerSettings()
478491
delete expression;
479492
delete extentGeom;
480493

481-
// clear pointers to QgsDataDefined objects
494+
// delete all QgsDataDefined objects (which also deletes their QgsExpression object)
495+
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::iterator it = dataDefinedProperties.begin();
496+
for ( ; it != dataDefinedProperties.constEnd(); ++it )
497+
{
498+
delete( it.value() );
499+
it.value() = 0;
500+
}
482501
dataDefinedProperties.clear();
483502
}
484503

‎src/core/qgspallabeling.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class CORE_EXPORT QgsPalLayerSettings
6767
QgsPalLayerSettings( const QgsPalLayerSettings& s );
6868
~QgsPalLayerSettings();
6969

70+
//! copy operator - only copies the permanent members
71+
QgsPalLayerSettings &operator=( const QgsPalLayerSettings & s );
72+
7073
//! @note added in 2.4
7174
static QgsPalLayerSettings fromLayer( QgsVectorLayer* layer );
7275

@@ -534,6 +537,8 @@ class CORE_EXPORT QgsPalLayerSettings
534537
bool dataDefinedUseExpression( QgsPalLayerSettings::DataDefinedProperties p ) const;
535538

536539
/** Map of current data defined properties
540+
*
541+
* Pointers to QgsDataDefined should never be null, the pointers are owned by this class
537542
*/
538543
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > dataDefinedProperties;
539544

‎src/core/qgsvectorlayerlabelprovider.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,6 @@ void QgsVectorLayerLabelProvider::init()
102102

103103
QgsVectorLayerLabelProvider::~QgsVectorLayerLabelProvider()
104104
{
105-
// delete all QgsDataDefined objects (which also deletes their QgsExpression object)
106-
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::iterator it = mSettings.dataDefinedProperties.begin();
107-
for ( ; it != mSettings.dataDefinedProperties.constEnd(); ++it )
108-
{
109-
delete( it.value() );
110-
it.value() = 0;
111-
}
112-
mSettings.dataDefinedProperties.clear();
113-
114105
qDeleteAll( mLabels );
115106

116107
if ( mOwnsSource )

0 commit comments

Comments
 (0)
Please sign in to comment.