mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-06 00:05:02 -05:00
Merge pull request #8079 from elpaso/bugfix-19981-value-relation-0
Fixes value relation widget 0 indexed related items
This commit is contained in:
commit
27e4b192bd
@ -179,7 +179,19 @@ void QgsValueRelationWidgetWrapper::setValue( const QVariant &value )
|
||||
}
|
||||
else if ( mComboBox )
|
||||
{
|
||||
mComboBox->setCurrentIndex( mComboBox->findData( value ) );
|
||||
// findData fails to tell a 0 from a NULL
|
||||
// See: "Value relation, value 0 = NULL" - https://issues.qgis.org/issues/19981
|
||||
int idx = -1; // default to not found
|
||||
for ( int i = 0; i < mComboBox->count(); i++ )
|
||||
{
|
||||
QVariant v( mComboBox->itemData( i ) );
|
||||
if ( v.isNull() == value.isNull() && v == value )
|
||||
{
|
||||
idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mComboBox->setCurrentIndex( idx );
|
||||
}
|
||||
else if ( mLineEdit )
|
||||
{
|
||||
|
@ -42,6 +42,8 @@ class TestQgsValueRelationWidgetWrapper : public QObject
|
||||
void testScrollBarUnlocked();
|
||||
void testDrillDown();
|
||||
void testDrillDownMulti();
|
||||
//! Checks that a related value of 0 is not interpreted as a NULL
|
||||
void testZeroIndexInRelatedTable();
|
||||
};
|
||||
|
||||
void TestQgsValueRelationWidgetWrapper::initTestCase()
|
||||
@ -200,6 +202,7 @@ void TestQgsValueRelationWidgetWrapper::testDrillDown()
|
||||
// Check null is selected
|
||||
QCOMPARE( w_municipality.mComboBox->count(), 3 );
|
||||
QCOMPARE( w_municipality.mComboBox->itemText( 0 ), QStringLiteral( "(no selection)" ) );
|
||||
QVERIFY( w_municipality.value().isNull() );
|
||||
QCOMPARE( w_municipality.value().toString(), QString() );
|
||||
|
||||
// Check order by value false
|
||||
@ -311,5 +314,59 @@ void TestQgsValueRelationWidgetWrapper::testDrillDownMulti()
|
||||
|
||||
}
|
||||
|
||||
void TestQgsValueRelationWidgetWrapper::testZeroIndexInRelatedTable()
|
||||
{
|
||||
// findData fails to tell a 0 from a NULL
|
||||
// See: "Value relation, value 0 = NULL" - https://issues.qgis.org/issues/19981
|
||||
|
||||
// create a vector layer
|
||||
QgsVectorLayer vl1( QStringLiteral( "Polygon?crs=epsg:4326&field=pk:int&field=province:int&field=municipality:string" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) );
|
||||
QgsVectorLayer vl2( QStringLiteral( "Point?crs=epsg:4326&field=pk:int&field=fk_province:int&field=fk_municipality:int" ), QStringLiteral( "vl2" ), QStringLiteral( "memory" ) );
|
||||
QgsProject::instance()->addMapLayer( &vl1, false, false );
|
||||
QgsProject::instance()->addMapLayer( &vl2, false, false );
|
||||
|
||||
// insert some features
|
||||
QgsFeature f1( vl1.fields() );
|
||||
f1.setAttribute( QStringLiteral( "pk" ), 0 ); // !!! Notice: pk 0
|
||||
f1.setAttribute( QStringLiteral( "province" ), 123 );
|
||||
f1.setAttribute( QStringLiteral( "municipality" ), QStringLiteral( "Some Place By The River" ) );
|
||||
f1.setGeometry( QgsGeometry::fromWkt( QStringLiteral( "POLYGON(( 0 0, 0 1, 1 1, 1 0, 0 0 ))" ) ) );
|
||||
QVERIFY( f1.isValid() );
|
||||
QgsFeature f2( vl1.fields() );
|
||||
f2.setAttribute( QStringLiteral( "pk" ), 2 );
|
||||
f2.setAttribute( QStringLiteral( "province" ), 245 );
|
||||
f2.setAttribute( QStringLiteral( "municipality" ), QStringLiteral( "Dreamland By The Clouds" ) );
|
||||
f2.setGeometry( QgsGeometry::fromWkt( QStringLiteral( "POLYGON(( 1 0, 1 1, 2 1, 2 0, 1 0 ))" ) ) );
|
||||
QVERIFY( f2.isValid() );
|
||||
QVERIFY( vl1.dataProvider()->addFeatures( QgsFeatureList() << f1 << f2 ) );
|
||||
|
||||
QgsFeature f3( vl2.fields() );
|
||||
f3.setAttribute( QStringLiteral( "fk_province" ), 123 );
|
||||
f3.setAttribute( QStringLiteral( "fk_municipality" ), QStringLiteral( "0" ) );
|
||||
f3.setGeometry( QgsGeometry::fromWkt( QStringLiteral( "POINT( 0.5 0.5)" ) ) );
|
||||
QVERIFY( f3.isValid() );
|
||||
QVERIFY( f3.geometry().isGeosValid() );
|
||||
QVERIFY( vl2.dataProvider()->addFeature( f3 ) );
|
||||
|
||||
// build a value relation widget wrapper for municipality
|
||||
QgsValueRelationWidgetWrapper w_municipality( &vl2, vl2.fields().indexOf( QStringLiteral( "fk_municipality" ) ), nullptr, nullptr );
|
||||
QVariantMap cfg_municipality;
|
||||
cfg_municipality.insert( QStringLiteral( "Layer" ), vl1.id() );
|
||||
cfg_municipality.insert( QStringLiteral( "Key" ), QStringLiteral( "pk" ) );
|
||||
cfg_municipality.insert( QStringLiteral( "Value" ), QStringLiteral( "municipality" ) );
|
||||
cfg_municipality.insert( QStringLiteral( "AllowMulti" ), false );
|
||||
cfg_municipality.insert( QStringLiteral( "NofColumns" ), 1 );
|
||||
cfg_municipality.insert( QStringLiteral( "AllowNull" ), true );
|
||||
cfg_municipality.insert( QStringLiteral( "OrderByValue" ), false );
|
||||
cfg_municipality.insert( QStringLiteral( "UseCompleter" ), false );
|
||||
w_municipality.setConfig( cfg_municipality );
|
||||
w_municipality.widget();
|
||||
w_municipality.setEnabled( true );
|
||||
|
||||
w_municipality.setValue( 0 );
|
||||
QCOMPARE( w_municipality.mComboBox->currentIndex(), 1 );
|
||||
QCOMPARE( w_municipality.mComboBox->currentText(), QStringLiteral( "Some Place By The River" ) );
|
||||
}
|
||||
|
||||
QGSTEST_MAIN( TestQgsValueRelationWidgetWrapper )
|
||||
#include "testqgsvaluerelationwidgetwrapper.moc"
|
||||
|
Loading…
x
Reference in New Issue
Block a user