Skip to content

Commit 6f6d562

Browse files
committedFeb 11, 2019
Fix QgsFieldExpressionWidget doesn't correctly emit signals when
clearing the current expression/field
1 parent 9a75976 commit 6f6d562

File tree

2 files changed

+73
-32
lines changed

2 files changed

+73
-32
lines changed
 

‎src/gui/qgsfieldexpressionwidget.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ void QgsFieldExpressionWidget::setField( const QString &fieldName )
177177
if ( fieldName.isEmpty() )
178178
{
179179
setRow( -1 );
180+
emit fieldChanged( QString() );
181+
emit fieldChanged( QString(), true );
180182
return;
181183
}
182184

‎tests/src/gui/testqgsfieldexpressionwidget.cpp

Lines changed: 71 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -141,21 +141,60 @@ void TestQgsFieldExpressionWidget::asExpression()
141141
std::unique_ptr< QgsFieldExpressionWidget > widget( new QgsFieldExpressionWidget() );
142142
widget->setLayer( layer );
143143

144+
QSignalSpy spy( widget.get(), static_cast < void ( QgsFieldExpressionWidget::* )( const QString & ) >( &QgsFieldExpressionWidget::fieldChanged ) );
145+
QSignalSpy spy2( widget.get(), static_cast < void ( QgsFieldExpressionWidget::* )( const QString &, bool ) >( &QgsFieldExpressionWidget::fieldChanged ) );
146+
144147
// check with field set
145148
widget->setField( QStringLiteral( "fld" ) );
146-
QCOMPARE( widget->asExpression(), QString( "\"fld\"" ) );
149+
QCOMPARE( widget->asExpression(), QStringLiteral( "\"fld\"" ) );
150+
QCOMPARE( spy.count(), 1 );
151+
QCOMPARE( spy.constLast().at( 0 ).toString(), QStringLiteral( "fld" ) );
152+
QCOMPARE( spy2.count(), 1 );
153+
QCOMPARE( spy2.constLast().at( 0 ).toString(), QStringLiteral( "fld" ) );
154+
QVERIFY( spy2.constLast().at( 1 ).toBool() );
147155

148156
// check with expressions set
149157
widget->setField( QStringLiteral( "fld + 1" ) );
150-
QCOMPARE( widget->asExpression(), QString( "fld + 1" ) );
158+
QCOMPARE( widget->asExpression(), QStringLiteral( "fld + 1" ) );
159+
QCOMPARE( spy.count(), 2 );
160+
QCOMPARE( spy.constLast().at( 0 ).toString(), QStringLiteral( "fld + 1" ) );
161+
QCOMPARE( spy2.count(), 2 );
162+
QCOMPARE( spy2.constLast().at( 0 ).toString(), QStringLiteral( "fld + 1" ) );
163+
QVERIFY( spy2.constLast().at( 1 ).toBool() );
164+
151165
widget->setField( QStringLiteral( "1" ) );
152-
QCOMPARE( widget->asExpression(), QString( "1" ) );
166+
QCOMPARE( widget->asExpression(), QStringLiteral( "1" ) );
167+
QCOMPARE( spy.count(), 3 );
168+
QCOMPARE( spy.constLast().at( 0 ).toString(), QStringLiteral( "1" ) );
169+
QCOMPARE( spy2.count(), 3 );
170+
QCOMPARE( spy2.constLast().at( 0 ).toString(), QStringLiteral( "1" ) );
171+
QVERIFY( spy2.constLast().at( 1 ).toBool() );
172+
153173
widget->setField( QStringLiteral( "\"fld2\"" ) );
154-
QCOMPARE( widget->asExpression(), QString( "\"fld2\"" ) );
174+
QCOMPARE( widget->asExpression(), QStringLiteral( "\"fld2\"" ) );
175+
QCOMPARE( spy.count(), 4 );
176+
QCOMPARE( spy.constLast().at( 0 ).toString(), QStringLiteral( "fld2" ) );
177+
QCOMPARE( spy2.count(), 4 );
178+
QCOMPARE( spy2.constLast().at( 0 ).toString(), QStringLiteral( "fld2" ) );
179+
QVERIFY( spy2.constLast().at( 1 ).toBool() );
155180

156181
// check switching back to a field
157182
widget->setField( QStringLiteral( "fld3" ) );
158-
QCOMPARE( widget->asExpression(), QString( "\"fld3\"" ) );
183+
QCOMPARE( widget->asExpression(), QStringLiteral( "\"fld3\"" ) );
184+
QCOMPARE( spy.count(), 5 );
185+
QCOMPARE( spy.constLast().at( 0 ).toString(), QStringLiteral( "fld3" ) );
186+
QCOMPARE( spy2.count(), 5 );
187+
QCOMPARE( spy2.constLast().at( 0 ).toString(), QStringLiteral( "fld3" ) );
188+
QVERIFY( spy2.constLast().at( 1 ).toBool() );
189+
190+
// and back to null
191+
widget->setField( QString() );
192+
QVERIFY( widget->asExpression().isEmpty() );
193+
QCOMPARE( spy.count(), 6 );
194+
QVERIFY( spy.constLast().at( 0 ).toString().isEmpty() );
195+
QCOMPARE( spy2.count(), 6 );
196+
QVERIFY( spy2.constLast().at( 0 ).toString().isEmpty() );
197+
QVERIFY( spy2.constLast().at( 1 ).toBool() );
159198

160199
QgsProject::instance()->removeMapLayer( layer );
161200
}
@@ -175,43 +214,43 @@ void TestQgsFieldExpressionWidget::testIsValid()
175214
bool isExpression = false;
176215
bool isValid = false;
177216
widget->setField( QStringLiteral( "fld" ) );
178-
QCOMPARE( widget->currentField( &isExpression, &isValid ), QString( "fld" ) );
217+
QCOMPARE( widget->currentField( &isExpression, &isValid ), QStringLiteral( "fld" ) );
179218
QVERIFY( !isExpression );
180219
QVERIFY( isValid );
181220
QVERIFY( widget->isValidExpression() );
182221
QCOMPARE( spy.count(), 1 );
183-
QCOMPARE( spy.last().at( 0 ).toString(), QString( "fld" ) );
222+
QCOMPARE( spy.last().at( 0 ).toString(), QStringLiteral( "fld" ) );
184223
QVERIFY( spy.last().at( 1 ).toBool() );
185224

186225

187226
//check with complex field name set
188227
widget->setField( QStringLiteral( "name with space" ) );
189-
QCOMPARE( widget->currentField( &isExpression, &isValid ), QString( "name with space" ) );
228+
QCOMPARE( widget->currentField( &isExpression, &isValid ), QStringLiteral( "name with space" ) );
190229
QVERIFY( !isExpression );
191230
QVERIFY( isValid );
192231
QVERIFY( !widget->isValidExpression() );
193232
QCOMPARE( spy.count(), 2 );
194-
QCOMPARE( spy.last().at( 0 ).toString(), QString( "name with space" ) );
233+
QCOMPARE( spy.last().at( 0 ).toString(), QStringLiteral( "name with space" ) );
195234
QVERIFY( spy.last().at( 1 ).toBool() );
196235

197236
//check with valid expression set
198237
widget->setField( QStringLiteral( "2 * 4" ) );
199-
QCOMPARE( widget->currentField( &isExpression, &isValid ), QString( "2 * 4" ) );
238+
QCOMPARE( widget->currentField( &isExpression, &isValid ), QStringLiteral( "2 * 4" ) );
200239
QVERIFY( isExpression );
201240
QVERIFY( isValid );
202241
QVERIFY( widget->isValidExpression() );
203242
QCOMPARE( spy.count(), 3 );
204-
QCOMPARE( spy.last().at( 0 ).toString(), QString( "2 * 4" ) );
243+
QCOMPARE( spy.last().at( 0 ).toString(), QStringLiteral( "2 * 4" ) );
205244
QVERIFY( spy.last().at( 1 ).toBool() );
206245

207246
//check with invalid expression set
208247
widget->setField( QStringLiteral( "2 *" ) );
209-
QCOMPARE( widget->currentField( &isExpression, &isValid ), QString( "2 *" ) );
248+
QCOMPARE( widget->currentField( &isExpression, &isValid ), QStringLiteral( "2 *" ) );
210249
QVERIFY( isExpression );
211250
QVERIFY( !isValid );
212251
QVERIFY( !widget->isValidExpression() );
213252
QCOMPARE( spy.count(), 4 );
214-
QCOMPARE( spy.last().at( 0 ).toString(), QString( "2 *" ) );
253+
QCOMPARE( spy.last().at( 0 ).toString(), QStringLiteral( "2 *" ) );
215254
QVERIFY( !spy.last().at( 1 ).toBool() );
216255

217256
QgsProject::instance()->removeMapLayer( layer );
@@ -226,46 +265,46 @@ void TestQgsFieldExpressionWidget::testFilters()
226265
widget->setLayer( layer );
227266

228267
QCOMPARE( widget->mCombo->count(), 8 );
229-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "intfld" ) );
230-
QCOMPARE( widget->mCombo->itemText( 1 ), QString( "stringfld" ) );
231-
QCOMPARE( widget->mCombo->itemText( 2 ), QString( "string2fld" ) );
232-
QCOMPARE( widget->mCombo->itemText( 3 ), QString( "longfld" ) );
233-
QCOMPARE( widget->mCombo->itemText( 4 ), QString( "doublefld" ) );
234-
QCOMPARE( widget->mCombo->itemText( 5 ), QString( "datefld" ) );
235-
QCOMPARE( widget->mCombo->itemText( 6 ), QString( "timefld" ) );
236-
QCOMPARE( widget->mCombo->itemText( 7 ), QString( "datetimefld" ) );
268+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "intfld" ) );
269+
QCOMPARE( widget->mCombo->itemText( 1 ), QStringLiteral( "stringfld" ) );
270+
QCOMPARE( widget->mCombo->itemText( 2 ), QStringLiteral( "string2fld" ) );
271+
QCOMPARE( widget->mCombo->itemText( 3 ), QStringLiteral( "longfld" ) );
272+
QCOMPARE( widget->mCombo->itemText( 4 ), QStringLiteral( "doublefld" ) );
273+
QCOMPARE( widget->mCombo->itemText( 5 ), QStringLiteral( "datefld" ) );
274+
QCOMPARE( widget->mCombo->itemText( 6 ), QStringLiteral( "timefld" ) );
275+
QCOMPARE( widget->mCombo->itemText( 7 ), QStringLiteral( "datetimefld" ) );
237276

238277
widget->setFilters( QgsFieldProxyModel::String );
239278
QCOMPARE( widget->mCombo->count(), 2 );
240-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "stringfld" ) );
241-
QCOMPARE( widget->mCombo->itemText( 1 ), QString( "string2fld" ) );
279+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "stringfld" ) );
280+
QCOMPARE( widget->mCombo->itemText( 1 ), QStringLiteral( "string2fld" ) );
242281

243282
widget->setFilters( QgsFieldProxyModel::Int );
244283
QCOMPARE( widget->mCombo->count(), 1 );
245-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "intfld" ) );
284+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "intfld" ) );
246285

247286
widget->setFilters( QgsFieldProxyModel::LongLong );
248287
QCOMPARE( widget->mCombo->count(), 1 );
249-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "longfld" ) );
288+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "longfld" ) );
250289

251290
widget->setFilters( QgsFieldProxyModel::Double );
252291
QCOMPARE( widget->mCombo->count(), 1 );
253-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "doublefld" ) );
292+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "doublefld" ) );
254293

255294
widget->setFilters( QgsFieldProxyModel::Numeric );
256295
QCOMPARE( widget->mCombo->count(), 3 );
257-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "intfld" ) );
258-
QCOMPARE( widget->mCombo->itemText( 1 ), QString( "longfld" ) );
259-
QCOMPARE( widget->mCombo->itemText( 2 ), QString( "doublefld" ) );
296+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "intfld" ) );
297+
QCOMPARE( widget->mCombo->itemText( 1 ), QStringLiteral( "longfld" ) );
298+
QCOMPARE( widget->mCombo->itemText( 2 ), QStringLiteral( "doublefld" ) );
260299

261300
widget->setFilters( QgsFieldProxyModel::Date );
262301
QCOMPARE( widget->mCombo->count(), 2 );
263-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "datefld" ) );
264-
QCOMPARE( widget->mCombo->itemText( 1 ), QString( "datetimefld" ) );
302+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "datefld" ) );
303+
QCOMPARE( widget->mCombo->itemText( 1 ), QStringLiteral( "datetimefld" ) );
265304

266305
widget->setFilters( QgsFieldProxyModel::Time );
267306
QCOMPARE( widget->mCombo->count(), 1 );
268-
QCOMPARE( widget->mCombo->itemText( 0 ), QString( "timefld" ) );
307+
QCOMPARE( widget->mCombo->itemText( 0 ), QStringLiteral( "timefld" ) );
269308

270309
QgsProject::instance()->removeMapLayer( layer );
271310
}

0 commit comments

Comments
 (0)
Please sign in to comment.