QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsattributetypeloaddialog.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsattributetypeloaddialog.cpp
3 -------------------
4 begin : June 2009
5 copyright : (C) 2000 by Richard Kostecky
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgsmaplayer.h"
21#include "qgsfeatureiterator.h"
23#include "qgslogger.h"
24#include "qgsproject.h"
25#include "qgsvectorlayer.h"
26
27#include <QTableWidgetItem>
28#include <QLineEdit>
29#include <QComboBox>
30#include <QLabel>
31#include <QFrame>
32#include <QCompleter>
33#include <QSpinBox>
34#include <QPushButton>
35#include <QHBoxLayout>
36#include <QFileDialog>
37
39 : mLayer( vl )
40{
41 setupUi( this );
42
43 connect( layerComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsAttributeTypeLoadDialog::fillComboBoxes );
44 connect( keyComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, [ = ]( int index ) { createPreview( index ); } );
45 connect( valueComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, [ = ]( int index ) { createPreview( index ); } );
46 connect( previewButton, &QAbstractButton::pressed, this, &QgsAttributeTypeLoadDialog::previewButtonPushed );
47
48 fillLayerList();
49
50 keyComboBox->setDisabled( true );
51 valueComboBox->setDisabled( true );
52}
53
55{
56 mLayer = layer;
57}
58
59void QgsAttributeTypeLoadDialog::previewButtonPushed()
60{
61 createPreview( valueComboBox->currentIndex(), true );
62}
63
64void QgsAttributeTypeLoadDialog::fillLayerList()
65{
66 layerComboBox->blockSignals( true );
67 layerComboBox->clear();
68 const auto constMapLayers = QgsProject::instance()->mapLayers();
69 for ( QgsMapLayer *l : constMapLayers )
70 {
71 QgsVectorLayer *vl = qobject_cast< QgsVectorLayer * >( l );
72 if ( vl )
73 layerComboBox->addItem( vl->name(), vl->id() );
74 }
75 layerComboBox->setCurrentIndex( -1 );
76 layerComboBox->blockSignals( false );
77}
78
79void QgsAttributeTypeLoadDialog::fillComboBoxes( int layerIndex )
80{
81 keyComboBox->blockSignals( true );
82 valueComboBox->blockSignals( true );
83
84 //clear comboboxes first
85 keyComboBox->clear();
86 valueComboBox->clear();
87
88 QgsVectorLayer *vLayer = qobject_cast<QgsVectorLayer *>( layerIndex < 0 ? nullptr : QgsProject::instance()->mapLayer( layerComboBox->itemData( layerIndex ).toString() ) );
89 if ( vLayer )
90 {
91 QMap<QString, int> fieldMap = vLayer->dataProvider()->fieldNameMap();
92 QMap<QString, int>::iterator it = fieldMap.begin();
93 for ( ; it != fieldMap.end(); ++it )
94 {
95 keyComboBox->addItem( it.key(), it.value() );
96 valueComboBox->addItem( it.key(), it.value() );
97 }
98 }
99
100 keyComboBox->setEnabled( nullptr != vLayer );
101 valueComboBox->setEnabled( nullptr != vLayer );
102
103 keyComboBox->setCurrentIndex( -1 );
104 valueComboBox->setCurrentIndex( -1 );
105
106 keyComboBox->blockSignals( false );
107 valueComboBox->blockSignals( false );
108}
109
110void QgsAttributeTypeLoadDialog::createPreview( int fieldIndex, bool full )
111{
112 previewTableWidget->clearContents();
113
114 for ( int i = previewTableWidget->rowCount() - 1; i > 0; i-- )
115 {
116 previewTableWidget->removeRow( i );
117 }
118 if ( layerComboBox->currentIndex() < 0 || fieldIndex < 0 )
119 {
120 //when nothing is selected there is no reason for preview
121 return;
122 }
123 const int idx = keyComboBox->currentData().toInt();
124 const int idx2 = valueComboBox->currentData().toInt();
125 QgsMapLayer *dataLayer = QgsProject::instance()->mapLayer( layerComboBox->currentData().toString() );
126 QgsVectorLayer *vLayer = qobject_cast<QgsVectorLayer *>( dataLayer );
127 if ( !vLayer )
128 return;
129
130 QgsAttributeList attributeList = QgsAttributeList();
131 attributeList.append( idx );
132 attributeList.append( idx2 );
133
134 QgsFeatureIterator fit = vLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributeList ) );
135
136 QgsFeature f;
137 QMap<QString, QVariant> valueMap;
138 while ( fit.nextFeature( f ) )
139 {
140 const QVariant val1 = f.attribute( idx );
141 const QVariant val2 = f.attribute( idx2 );
142 if ( val1.isValid() && !QgsVariantUtils::isNull( val1 ) && !val1.toString().isEmpty()
143 && val2.isValid() && !QgsVariantUtils::isNull( val2 ) && !val2.toString().isEmpty() )
144 {
145 valueMap.insert( val1.toString(), val2.toString() );
146 }
147 if ( !full && valueMap.size() > 8 )
148 break; //just first entries all on button
149 }
150 int row = 0;
151 for ( QMap<QString, QVariant>::iterator mit = valueMap.begin(); mit != valueMap.end(); ++mit, row++ )
152 {
153 previewTableWidget->insertRow( row );
154 previewTableWidget->setItem( row, 0, new QTableWidgetItem( mit.value().toString() ) );
155 previewTableWidget->setItem( row, 1, new QTableWidgetItem( mit.key() ) );
156 }
157}
158
159QMap<QString, QVariant> &QgsAttributeTypeLoadDialog::valueMap()
160{
161 return mValueMap;
162}
163
165{
166 return nullCheckBox->isChecked();
167}
168
169void QgsAttributeTypeLoadDialog::loadDataToValueMap()
170{
171 mValueMap.clear();
172 const int idx = keyComboBox->currentData().toInt();
173 const int idx2 = valueComboBox->currentData().toInt();
174 QgsMapLayer *dataLayer = QgsProject::instance()->mapLayer( layerComboBox->currentData().toString() );
175 QgsVectorLayer *vLayer = qobject_cast<QgsVectorLayer *>( dataLayer );
176 if ( !vLayer )
177 return;
178
179 QgsAttributeList attributeList = QgsAttributeList();
180 attributeList.append( idx );
181 attributeList.append( idx2 );
182
183 QgsFeatureIterator fit = vLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributeList ) );
184
185 QgsFeature f;
186 while ( fit.nextFeature( f ) )
187 {
188 const QVariant val = f.attribute( idx );
189 if ( val.isValid() && !QgsVariantUtils::isNull( val ) && !val.toString().isEmpty() )
190 {
191 mValueMap.insert( f.attribute( idx2 ).toString(), val );
192 }
193 }
194}
195
197{
198 //store data to output variable
199 loadDataToValueMap();
200 QDialog::accept();
201}
void accept() override
Overloaded accept method which will write the feature field values, then delegate to QDialog::accept(...
QgsAttributeTypeLoadDialog(QgsVectorLayer *vl)
bool insertNull()
Returns true if the "Add NULL value" checkbox has been checked.
QMap< QString, QVariant > & valueMap()
Returns the value map which is currently active.
void setVectorLayer(QgsVectorLayer *layer)
Sets predefined vector layer for selection of data.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
This class wraps a request for features to a vector layer (or directly its vector data provider).
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Definition: qgsfeature.cpp:338
Base class for all map layer types.
Definition: qgsmaplayer.h:73
QString name
Definition: qgsmaplayer.h:76
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:477
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
static bool isNull(const QVariant &variant)
Returns true if the specified variant should be considered a NULL value.
QMap< QString, int > fieldNameMap() const
Returns a map where the key is the name of the field and the value is its index.
Represents a vector layer which manages a vector based data sets.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
QList< int > QgsAttributeList
Definition: qgsfield.h:26