From 82648ab7aef44d007d96700ba2af0800cc9cfc6a Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Tue, 23 Nov 2021 07:47:34 +0100 Subject: [PATCH 1/3] Preserve data types for default values when they are created in the attribute dialog Fixes #46158 --- src/gui/qgsattributeform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/qgsattributeform.cpp b/src/gui/qgsattributeform.cpp index 3324e0e6cb5..f408bee3a62 100644 --- a/src/gui/qgsattributeform.cpp +++ b/src/gui/qgsattributeform.cpp @@ -551,7 +551,7 @@ void QgsAttributeForm::updateValuesDependenciesDefaultValues( const int originId continue; QgsExpressionContext context = createExpressionContext( updatedFeature ); - QString value = mLayer->defaultValue( eww->fieldIdx(), updatedFeature, &context ).toString(); + const QVariant value = mLayer->defaultValue( eww->fieldIdx(), updatedFeature, &context ); eww->setValue( value ); } } From 6e745614af4e49f747b756157da2e3b04f21ff36 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Tue, 23 Nov 2021 22:45:33 +0100 Subject: [PATCH 2/3] Update form feature with live values --- src/gui/qgsattributeform.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/qgsattributeform.cpp b/src/gui/qgsattributeform.cpp index f408bee3a62..5cc8091008a 100644 --- a/src/gui/qgsattributeform.cpp +++ b/src/gui/qgsattributeform.cpp @@ -553,6 +553,7 @@ void QgsAttributeForm::updateValuesDependenciesDefaultValues( const int originId QgsExpressionContext context = createExpressionContext( updatedFeature ); const QVariant value = mLayer->defaultValue( eww->fieldIdx(), updatedFeature, &context ); eww->setValue( value ); + mCurrentFormFeature.setAttribute( eww->field().name(), value ); } } } From c1b8722eb98aea247a68099801c980de3ad1786a Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Tue, 23 Nov 2021 22:46:05 +0100 Subject: [PATCH 3/3] Add test for live value update --- tests/Testing/Temporary/CTestCostData.txt | 1 + tests/src/python/test_qgsattributeform.py | 28 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/Testing/Temporary/CTestCostData.txt diff --git a/tests/Testing/Temporary/CTestCostData.txt b/tests/Testing/Temporary/CTestCostData.txt new file mode 100644 index 00000000000..ed97d539c09 --- /dev/null +++ b/tests/Testing/Temporary/CTestCostData.txt @@ -0,0 +1 @@ +--- diff --git a/tests/src/python/test_qgsattributeform.py b/tests/src/python/test_qgsattributeform.py index 930ff3347a7..58cfeab4852 100644 --- a/tests/src/python/test_qgsattributeform.py +++ b/tests/src/python/test_qgsattributeform.py @@ -22,13 +22,17 @@ from qgis.core import ( QgsEditorWidgetSetup, QgsEditFormConfig, QgsAttributeEditorElement, + QgsDefaultValue, + QgsField ) from qgis.gui import ( QgsAttributeForm, QgsGui, QgsEditorWidgetWrapper, - QgsMapCanvas + QgsMapCanvas, + QgsAttributeEditorContext ) +from qgis.PyQt.QtCore import QVariant QGISAPP = start_app() @@ -115,6 +119,28 @@ class TestQgsAttributeForm(unittest.TestCase): for field_type, value in field_types.items(): self.checkForm(field_type, value) + def test_on_update(self): + """Test live update""" + + layer = QgsVectorLayer("Point?field=age:int", "vl", "memory") + # set default value for numbers to [1, {age}], it will depend on the field age and should update + field = QgsField('numbers', QVariant.List, 'array') + field.setEditorWidgetSetup(QgsEditorWidgetSetup('List', {})) + layer.dataProvider().addAttributes([field]) + layer.updateFields() + layer.setDefaultValueDefinition(1, QgsDefaultValue('array(1, age)', True)) + layer.setEditorWidgetSetup(1, QgsEditorWidgetSetup('List', {})) + layer.startEditing() + form = QgsAttributeForm(layer) + feature = QgsFeature(layer.fields()) + form.setFeature(feature) + form.setMode(QgsAttributeEditorContext.AddFeatureMode) + form.changeAttribute('numbers', [12]) + form.changeAttribute('age', 1) + self.assertEqual(form.currentFormFeature()['numbers'], [1, 1]) + form.changeAttribute('age', 7) + self.assertEqual(form.currentFormFeature()['numbers'], [1, 7]) + if __name__ == '__main__': unittest.main()