QGIS API Documentation 3.32.0-Lima (311a8cb8a6)
qgsattributetablemodel.h
Go to the documentation of this file.
1/***************************************************************************
2 QgsAttributeTableModel.h - Models for attribute table
3 -------------------
4 date : Feb 2009
5 copyright : (C) 2009 by Vita Cizek
6 email : weetya (at) gmail.com
7
8 ***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17#ifndef QGSATTRIBUTETABLEMODEL_H
18#define QGSATTRIBUTETABLEMODEL_H
19
20#include <QAbstractTableModel>
21#include "qgis_sip.h"
22#include <QModelIndex>
23#include <QObject>
24#include <QHash>
25#include <QQueue>
26#include <QMap>
27
28#include "qgsconditionalstyle.h"
31#include "qgis_gui.h"
32
33class QgsMapCanvas;
37
49class GUI_EXPORT QgsAttributeTableModel: public QAbstractTableModel
50{
51 Q_OBJECT
52
53 public:
54 enum Role
55 {
56 FeatureIdRole = Qt::UserRole,
59 // Insert new values here, SortRole needs to be the last one
61 };
62
63 public:
64
70 QgsAttributeTableModel( QgsVectorLayerCache *layerCache, QObject *parent = nullptr );
71
76 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
77
82 int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
83
90 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
91
97 QVariant data( const QModelIndex &index, int role ) const override;
98
105 bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
106
111 Qt::ItemFlags flags( const QModelIndex &index ) const override;
112
118 void reload( const QModelIndex &index1, const QModelIndex &index2 );
119
123 bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override;
124
130 inline void resetModel() { loadLayer(); }
131
136 int idToRow( QgsFeatureId id ) const;
137
138 QModelIndex idToIndex( QgsFeatureId id ) const;
139
140 QModelIndexList idToIndexList( QgsFeatureId id ) const;
141
145 int fieldIdx( int col ) const;
146
150 int fieldCol( int idx ) const;
151
156 QgsFeatureId rowToId( int row ) const;
157
163 void swapRows( QgsFeatureId a, QgsFeatureId b );
164
168 inline QgsVectorLayer *layer() const { return mLayer; }
169
173 inline QgsVectorLayerCache *layerCache() const { return mLayerCache; }
174
178 void executeAction( QUuid action, const QModelIndex &idx ) const;
179
183 void executeMapLayerAction( QgsMapLayerAction *action, const QModelIndex &idx, const QgsMapLayerActionContext &context = QgsMapLayerActionContext() ) const;
184
189 QgsFeature feature( const QModelIndex &idx ) const;
190
198 void prefetchColumnData( int column );
199
206 void prefetchSortData( const QString &expression, unsigned long cacheIndex = 0 );
207
213 QString sortCacheExpression( unsigned long cacheIndex = 0 ) const;
214
222 void setRequest( const QgsFeatureRequest &request );
223
224 // TODO QGIS 4: return copy instead of reference
225
229 const QgsFeatureRequest &request() const;
230
237 void setEditorContext( const QgsAttributeEditorContext &context ) { mEditorContext = context; }
238
245 const QgsAttributeEditorContext &editorContext() const { return mEditorContext; }
246
251 int extraColumns() const;
252
257 void setExtraColumns( int extraColumns );
258
264 bool showValidityState() const { return mShowValidityState; }
265
271 void setShowValidityState( bool show ) { mShowValidityState = show; }
272
273 public slots:
274
279 virtual void loadLayer();
280
286 void fieldConditionalStyleChanged( const QString &fieldName );
287
288 signals:
289
294
296 void progress( int i, bool &cancel ) SIP_SKIP;
297 void finished();
298
299 private slots:
300
304 virtual void updatedFields();
305
311 virtual void editCommandEnded();
312
316 virtual void attributeDeleted( int idx );
317
324 virtual void attributeValueChanged( QgsFeatureId fid, int idx, const QVariant &value );
325
330 virtual void featuresDeleted( const QgsFeatureIds &fids );
331
336 virtual void featureAdded( QgsFeatureId fid );
337
341 virtual void layerDeleted();
342
343 virtual void fieldFormatterRemoved( QgsFieldFormatter *fieldFormatter );
344
345 private:
346 QgsVectorLayer *mLayer = nullptr;
347 QgsVectorLayerCache *mLayerCache = nullptr;
348 int mFieldCount = 0;
349
350 mutable QgsFeature mFeat;
351
352 QgsFields mFields;
353 QgsAttributeList mAttributes;
354
355 struct WidgetData
356 {
357 QgsFieldFormatter *fieldFormatter = nullptr;
358 QVariant cache;
359 QVariantMap config;
360 bool loaded = false;
361 };
362 mutable QVector<WidgetData> mWidgetDatas;
363
364 QHash<QgsFeatureId, int> mIdRowMap;
365 QHash<int, QgsFeatureId> mRowIdMap;
366 mutable QHash<QgsFeatureId, QList<QgsConditionalStyle> > mRowStylesMap;
367 mutable QHash<QgsFeatureId, QHash<int, QgsConditionalStyle> > mConstraintStylesMap;
368
369 mutable QgsExpressionContext mExpressionContext;
370
374 const WidgetData &getWidgetData( int column ) const;
375
379 void loadAttributes();
380
388 virtual bool loadFeatureAtId( QgsFeatureId fid ) const;
389
400 virtual bool loadFeatureAtId( QgsFeatureId fid, int fieldIdx ) const;
401
402 QgsFeatureRequest mFeatureRequest;
403
404 struct SortCache
405 {
407 int sortFieldIndex;
409 QgsExpression sortCacheExpression;
410 QgsAttributeList sortCacheAttributes;
412 QHash<QgsFeatureId, QVariant> sortCache;
413 };
414
415 std::vector<SortCache> mSortCaches;
416
417 QgsAttributeEditorContext mEditorContext;
418
419 int mExtraColumns = 0;
420
422 bool mBulkEditCommandRunning = false;
423
425 bool mResettingModel = false;
426
428 void bulkEditCommandStarted();
429
431 void bulkEditCommandEnded();
432
434 QMap<QPair<QgsFeatureId, int>, QVariant> mAttributeValueChanges;
435
437 QList<QgsFeatureId> mInsertedRowsChanges;
438
440 bool mIsCleaningUpAfterRollback = false;
441
442 bool mShowValidityState = false;
443
444 friend class TestQgsAttributeTable;
445
446};
447
448
449#endif
This class contains context information for attribute editor widgets.
A model backed by a QgsVectorLayerCache which is able to provide feature/attribute information to a Q...
const QgsAttributeEditorContext & editorContext() const
Returns the context in which this table is shown.
void resetModel()
Resets the model.
void modelChanged()
Model has been changed.
void progress(int i, bool &cancel)
void setEditorContext(const QgsAttributeEditorContext &context)
Sets the context in which this table is shown.
QgsVectorLayer * layer() const
Returns the layer this model uses as backend.
QgsVectorLayerCache * layerCache() const
Returns the layer cache this model uses as backend.
void setShowValidityState(bool show)
Sets whether the attribute table will add a visual feedback to cells when an attribute constraint is ...
@ SortRole
Role used for sorting start here.
@ FieldIndexRole
Get the field index of this column.
@ UserRole
Start further roles starting from this role.
bool showValidityState() const
Returns whether the attribute table will add a visual feedback to cells when an attribute constraint ...
Every attribute editor widget needs a factory, which inherits this class.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Class for parsing and evaluation of expressions (formerly called "search strings").
This class wraps a request for features to a vector layer (or directly its vector data provider).
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
A field formatter helps to handle and display values for a field.
Container of fields for a vector layer.
Definition: qgsfields.h:45
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:90
Encapsulates the context in which a QgsMapLayerAction action is executed.
An action which can run on map layers The class can be used in two manners:
This class caches features of a given QgsVectorLayer.
Represents a vector layer which manages a vector based data sets.
#define SIP_SKIP
Definition: qgis_sip.h:126
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:37
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28
QList< int > QgsAttributeList
Definition: qgsfield.h:27