From 2e939e0d454f09a8b003e385cc379b92bde50008 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Fri, 14 Feb 2020 09:50:56 +0100 Subject: [PATCH] Merge pull request #34428 from elpaso/bugfix-gh34404-crash-on-apply-default-value Fix crash when switching "apply default value on update" --- src/gui/qgsattributeform.cpp | 62 +++++++++++++++++++++--------------- src/gui/qgsattributeform.h | 2 ++ 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/gui/qgsattributeform.cpp b/src/gui/qgsattributeform.cpp index 96d94e4d369a..2edff59fd32e 100644 --- a/src/gui/qgsattributeform.cpp +++ b/src/gui/qgsattributeform.cpp @@ -446,6 +446,10 @@ bool QgsAttributeForm::saveEdits() bool QgsAttributeForm::updateDefaultValues( const int originIdx ) { + + // Synchronize + updateDefaultValueDependencies(); + if ( !mDefaultValueDependencies.contains( originIdx ) ) return false; @@ -1544,32 +1548,7 @@ void QgsAttributeForm::init() } } - //create defaultValueDependencies - for ( QgsWidgetWrapper *ww : qgis::as_const( mWidgets ) ) - { - QgsEditorWidgetWrapper *eww = qobject_cast( ww ); - if ( eww ) - { - QgsExpression exp( eww->field().defaultValueDefinition().expression() ); - const QSet referencedColumns = exp.referencedColumns(); - for ( const QString &referencedColumn : referencedColumns ) - { - if ( referencedColumn == QgsFeatureRequest::ALL_ATTRIBUTES ) - { - const QList allAttributeIds( mLayer->fields().allAttributesList() ); - - for ( const int id : allAttributeIds ) - { - mDefaultValueDependencies.insertMulti( id, eww ); - } - } - else - { - mDefaultValueDependencies.insertMulti( mLayer->fields().lookupField( referencedColumn ), eww ); - } - } - } - } + updateDefaultValueDependencies(); if ( !mButtonBox ) { @@ -2401,6 +2380,37 @@ bool QgsAttributeForm::fieldIsEditable( int fieldIndex ) const return QgsVectorLayerUtils::fieldIsEditable( mLayer, fieldIndex, mFeature ); } +void QgsAttributeForm::updateDefaultValueDependencies() +{ + mDefaultValueDependencies.clear(); + //create defaultValueDependencies + for ( QgsWidgetWrapper *ww : qgis::as_const( mWidgets ) ) + { + QgsEditorWidgetWrapper *eww = qobject_cast( ww ); + if ( eww ) + { + QgsExpression exp( eww->field().defaultValueDefinition().expression() ); + const QSet referencedColumns = exp.referencedColumns(); + for ( const QString &referencedColumn : referencedColumns ) + { + if ( referencedColumn == QgsFeatureRequest::ALL_ATTRIBUTES ) + { + const QList allAttributeIds( mLayer->fields().allAttributesList() ); + + for ( const int id : allAttributeIds ) + { + mDefaultValueDependencies.insertMulti( id, eww ); + } + } + else + { + mDefaultValueDependencies.insertMulti( mLayer->fields().lookupField( referencedColumn ), eww ); + } + } + } + } +} + void QgsAttributeForm::updateIcon( QgsEditorWidgetWrapper *eww ) { if ( !eww->widget() || !mIconMap[eww->widget()] ) diff --git a/src/gui/qgsattributeform.h b/src/gui/qgsattributeform.h index feb81215e5d5..3c8aa3220e59 100644 --- a/src/gui/qgsattributeform.h +++ b/src/gui/qgsattributeform.h @@ -325,6 +325,8 @@ class GUI_EXPORT QgsAttributeForm : public QWidget bool fieldIsEditable( const QgsVectorLayer &layer, int fieldIndex, QgsFeatureId fid ) const; + void updateDefaultValueDependencies(); + struct WidgetInfo { QWidget *widget = nullptr;