Skip to content

Commit 9dca6da

Browse files
committed
Don't silently discard requests to set QgsFieldExpressionWidget
to an empty expression This causes issues in lots of places - e.g. a field constraint is always set to the first field in a layer, and cannot be removed. I've looked at all calls to setField and without exception they should accept that setting the field to an empty string results in an empty expression. Fixes #14325
1 parent 46d7a42 commit 9dca6da

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/gui/qgsfieldexpressionwidget.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,10 @@ void QgsFieldExpressionWidget::setLayer( QgsMapLayer *layer )
173173
void QgsFieldExpressionWidget::setField( const QString &fieldName )
174174
{
175175
if ( fieldName.isEmpty() )
176+
{
177+
setRow( -1 );
176178
return;
179+
}
177180

178181
QModelIndex idx = mFieldProxyModel->sourceFieldModel()->indexFromName( fieldName );
179182
if ( !idx.isValid() )

tests/src/gui/testqgsfieldexpressionwidget.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class TestQgsFieldExpressionWidget : public QObject
4747
void asExpression();
4848
void testIsValid();
4949
void testFilters();
50+
void setNull();
5051

5152
private:
5253
QgsFieldExpressionWidget *mWidget = nullptr;
@@ -269,6 +270,27 @@ void TestQgsFieldExpressionWidget::testFilters()
269270
QgsProject::instance()->removeMapLayer( layer );
270271
}
271272

273+
void TestQgsFieldExpressionWidget::setNull()
274+
{
275+
// test that QgsFieldExpressionWidget can be set to an empty value
276+
QgsVectorLayer *layer = new QgsVectorLayer( QStringLiteral( "point?field=fld:int&field=fld2:int&field=fld3:int" ), QStringLiteral( "x" ), QStringLiteral( "memory" ) );
277+
QgsProject::instance()->addMapLayer( layer );
278+
279+
std::unique_ptr< QgsFieldExpressionWidget > widget( new QgsFieldExpressionWidget() );
280+
widget->setLayer( layer );
281+
282+
widget->setField( QString() );
283+
QVERIFY( widget->currentField().isEmpty() );
284+
285+
widget->setField( QStringLiteral( "fld2" ) );
286+
QCOMPARE( widget->currentField(), QStringLiteral( "fld2" ) );
287+
288+
widget->setField( QString() );
289+
QVERIFY( widget->currentField().isEmpty() );
290+
291+
QgsProject::instance()->removeMapLayer( layer );
292+
}
293+
272294
QGSTEST_MAIN( TestQgsFieldExpressionWidget )
273295
#include "testqgsfieldexpressionwidget.moc"
274296

0 commit comments

Comments
 (0)