30   connect( mAddFilterButton, &QToolButton::clicked, 
this, &QgsRelationReferenceConfigDlg::mAddFilterButton_clicked );
    31   connect( mRemoveFilterButton, &QToolButton::clicked, 
this, &QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked );
    33   mExpressionWidget->registerExpressionContextGenerator( vl );
    35   connect( mComboRelation, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsRelationReferenceConfigDlg::relationChanged );
    38   for ( 
const QgsRelation &relation : constReferencingRelations )
    40     if ( relation.name().isEmpty() )
    41       mComboRelation->addItem( QStringLiteral( 
"%1 (%2)" ).arg( relation.id(), relation.referencedLayerId() ), relation.id() );
    43       mComboRelation->addItem( QStringLiteral( 
"%1 (%2)" ).arg( relation.name(), relation.referencedLayerId() ), relation.id() );
    44     if ( relation.referencedLayer() )
    46       mExpressionWidget->setField( relation.referencedLayer()->displayExpression() );
    66   mCbxAllowNull->setChecked( config.value( QStringLiteral( 
"AllowNULL" ), 
false ).toBool() );
    67   mCbxOrderByValue->setChecked( config.value( QStringLiteral( 
"OrderByValue" ), 
false ).toBool() );
    68   mCbxShowForm->setChecked( config.value( QStringLiteral( 
"ShowForm" ), 
false ).toBool() );
    69   mCbxShowOpenFormButton->setChecked( config.value( QStringLiteral( 
"ShowOpenFormButton" ), 
true ).toBool() );
    71   if ( config.contains( QStringLiteral( 
"Relation" ) ) )
    73     mComboRelation->setCurrentIndex( mComboRelation->findData( config.value( QStringLiteral( 
"Relation" ) ).toString() ) );
    74     relationChanged( mComboRelation->currentIndex() );
    77   mCbxMapIdentification->setChecked( config.value( QStringLiteral( 
"MapIdentification" ), 
false ).toBool() );
    78   mCbxAllowAddFeatures->setChecked( config.value( QStringLiteral( 
"AllowAddFeatures" ), 
false ).toBool() );
    79   mCbxReadOnly->setChecked( config.value( QStringLiteral( 
"ReadOnly" ), 
false ).toBool() );
    81   if ( config.contains( QStringLiteral( 
"FilterFields" ) ) )
    83     mFilterGroupBox->setChecked( 
true );
    84     const auto constToStringList = config.value( 
"FilterFields" ).toStringList();
    85     for ( 
const QString &fld : constToStringList )
    87       addFilterField( fld );
    90     mCbxChainFilters->setChecked( config.value( QStringLiteral( 
"ChainFilters" ) ).toBool() );
    94 void QgsRelationReferenceConfigDlg::relationChanged( 
int idx )
    96   QString relName = mComboRelation->itemData( idx ).toString();
   100   mExpressionWidget->setLayer( mReferencedLayer ); 
   101   if ( mReferencedLayer )
   104     mCbxMapIdentification->setEnabled( mReferencedLayer->
isSpatial() );
   110 void QgsRelationReferenceConfigDlg::mAddFilterButton_clicked()
   112   const auto constSelectedItems = mAvailableFieldsList->selectedItems();
   113   for ( QListWidgetItem *item : constSelectedItems )
   115     addFilterField( item );
   119 void QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked()
   121   const auto constSelectedItems = mFilterFieldsList->selectedItems();
   122   for ( QListWidgetItem *item : constSelectedItems )
   124     mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
   125     mAvailableFieldsList->addItem( item );
   131   QVariantMap myConfig;
   132   myConfig.insert( QStringLiteral( 
"AllowNULL" ), mCbxAllowNull->isChecked() );
   133   myConfig.insert( QStringLiteral( 
"OrderByValue" ), mCbxOrderByValue->isChecked() );
   134   myConfig.insert( QStringLiteral( 
"ShowForm" ), mCbxShowForm->isChecked() );
   135   myConfig.insert( QStringLiteral( 
"ShowOpenFormButton" ), mCbxShowOpenFormButton->isChecked() );
   136   myConfig.insert( QStringLiteral( 
"MapIdentification" ), mCbxMapIdentification->isEnabled() && mCbxMapIdentification->isChecked() );
   137   myConfig.insert( QStringLiteral( 
"ReadOnly" ), mCbxReadOnly->isChecked() );
   138   myConfig.insert( QStringLiteral( 
"Relation" ), mComboRelation->currentData() );
   139   myConfig.insert( QStringLiteral( 
"AllowAddFeatures" ), mCbxAllowAddFeatures->isChecked() );
   141   if ( mFilterGroupBox->isChecked() )
   143     QStringList filterFields;
   144     filterFields.reserve( mFilterFieldsList->count() );
   145     for ( 
int i = 0; i < mFilterFieldsList->count(); i++ )
   147       filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
   149     myConfig.insert( QStringLiteral( 
"FilterFields" ), filterFields );
   151     myConfig.insert( QStringLiteral( 
"ChainFilters" ), mCbxChainFilters->isChecked() );
   154   if ( mReferencedLayer )
   157     myConfig.insert( QStringLiteral( 
"ReferencedLayerDataSource" ), mReferencedLayer->
publicSource() );
   158     myConfig.insert( QStringLiteral( 
"ReferencedLayerProviderKey" ), mReferencedLayer->
providerType() );
   159     myConfig.insert( QStringLiteral( 
"ReferencedLayerId" ), mReferencedLayer->
id() );
   160     myConfig.insert( QStringLiteral( 
"ReferencedLayerName" ), mReferencedLayer->
name() );
   167 void QgsRelationReferenceConfigDlg::loadFields()
   169   mAvailableFieldsList->clear();
   170   mFilterFieldsList->clear();
   172   if ( mReferencedLayer )
   176     for ( 
int i = 0; i < flds.
count(); i++ )
   179       mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.
at( i ).
name() );
   184 void QgsRelationReferenceConfigDlg::addFilterField( 
const QString &
field )
   186   for ( 
int i = 0; i < mAvailableFieldsList->count(); i++ )
   188     if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() == 
field )
   190       addFilterField( mAvailableFieldsList->item( i ) );
   196 void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem *item )
   198   mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
   199   mFilterFieldsList->addItem( item );
   202 int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem *item )
   204   QListWidget *lw = item->listWidget();
   206   for ( 
int i = 0; i < lw->count(); i++ )
   208     if ( lw->item( i ) == item )
 
QString providerType() const
Returns the provider type (provider key) for this layer. 
 
Container of fields for a vector layer. 
 
void setDisplayExpression(const QString &displayExpression)
Set the preview expression, used to create a human readable preview string. 
 
int count() const
Returns number of items. 
 
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
 
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1) 
 
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject. 
 
QgsFields fields() const FINAL
Returns the list of fields of this layer. 
 
QString displayName() const
Returns the name to use when displaying this field. 
 
QList< QgsRelation > referencingRelations(int idx) const
Returns the layer's relations, where the foreign key is on this layer. 
 
QString publicSource() const
Gets a version of the internal layer definition that has sensitive bits removed (for example...
 
QgsVectorLayer referencedLayer
 
QgsRelationManager relationManager
 
QString displayExpression
 
QVariantMap config() override
Create a configuration from the current GUI state. 
 
void setConfig(const QVariantMap &config) override
Update the configuration widget to represent the given configuration. 
 
static QgsProject * instance()
Returns the QgsProject singleton instance. 
 
Q_INVOKABLE QgsRelation relation(const QString &id) const
Gets access to a relation by its id. 
 
Represents a vector layer which manages a vector based data sets. 
 
QgsRelationReferenceConfigDlg(QgsVectorLayer *vl, int fieldIdx, QWidget *parent)