From 353b72cabf26ac8fd723e38cd7c04f311dc2e911 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 19 Feb 2021 20:41:41 +1000 Subject: [PATCH] Fix crash when setting value for relation widget wrapper (#41653) Calling setForeignKeys during updateValues would result in the widget wrapper catching the relation widget's changed signal, triggering an assert as the foreign keys don't match the form's feature's key (since that hasn't yet been set). In any case, setting the initial value for a editor widget wrapper must NOT be treated as a user-induced value change. --- src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp | 5 +++++ src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp index 9d334f306db6..2ba43504811a 100644 --- a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp @@ -204,8 +204,10 @@ void QgsRelationReferenceWidgetWrapper::updateValues( const QVariant &val, const } Q_ASSERT( values.count() == fieldPairs.count() ); + mBlockChanges++; mWidget->setForeignKeys( values ); mWidget->setFormFeature( formFeature() ); + mBlockChanges--; } void QgsRelationReferenceWidgetWrapper::setEnabled( bool enabled ) @@ -218,6 +220,9 @@ void QgsRelationReferenceWidgetWrapper::setEnabled( bool enabled ) void QgsRelationReferenceWidgetWrapper::foreignKeysChanged( const QVariantList &values ) { + if ( mBlockChanges != 0 ) // initial value is being set, we can ignore this signal + return; + QVariant mainValue = QVariant( field().type() ); if ( !mWidget || !mWidget->relation().isValid() ) diff --git a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h index 2e786c0d0872..42fb9bb29b23 100644 --- a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h +++ b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h @@ -79,6 +79,7 @@ class GUI_EXPORT QgsRelationReferenceWidgetWrapper : public QgsEditorWidgetWrapp QgsMapCanvas *mCanvas = nullptr; QgsMessageBar *mMessageBar = nullptr; bool mIndeterminateState; + int mBlockChanges = 0; };