QGIS API Documentation 3.27.0-Master (9c08adf5ef)
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"
30#include "qgis_gui.h"
31
32class 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;
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
259 public slots:
260
265 virtual void loadLayer();
266
272 void fieldConditionalStyleChanged( const QString &fieldName );
273
274 signals:
275
280
282 void progress( int i, bool &cancel ) SIP_SKIP;
283 void finished();
284
285 private slots:
286
290 virtual void updatedFields();
291
297 virtual void editCommandEnded();
298
302 virtual void attributeDeleted( int idx );
303
310 virtual void attributeValueChanged( QgsFeatureId fid, int idx, const QVariant &value );
311
316 virtual void featuresDeleted( const QgsFeatureIds &fids );
317
322 virtual void featureAdded( QgsFeatureId fid );
323
327 virtual void layerDeleted();
328
329 virtual void fieldFormatterRemoved( QgsFieldFormatter *fieldFormatter );
330
331 private:
332 QgsVectorLayer *mLayer = nullptr;
333 QgsVectorLayerCache *mLayerCache = nullptr;
334 int mFieldCount = 0;
335
336 mutable QgsFeature mFeat;
337
338 QgsAttributeList mAttributes;
339 QVector<QgsEditorWidgetFactory *> mWidgetFactories;
340 QVector<QgsFieldFormatter *> mFieldFormatters;
341 QVector<QVariant> mAttributeWidgetCaches;
342 QVector<QVariantMap> mWidgetConfigs;
343
344 QHash<QgsFeatureId, int> mIdRowMap;
345 QHash<int, QgsFeatureId> mRowIdMap;
346 mutable QHash<QgsFeatureId, QList<QgsConditionalStyle> > mRowStylesMap;
347
348 mutable QgsExpressionContext mExpressionContext;
349
353 virtual void loadAttributes();
354
362 virtual bool loadFeatureAtId( QgsFeatureId fid ) const;
363
364 QgsFeatureRequest mFeatureRequest;
365
366 struct SortCache
367 {
369 int sortFieldIndex;
371 QgsExpression sortCacheExpression;
372 QgsAttributeList sortCacheAttributes;
374 QHash<QgsFeatureId, QVariant> sortCache;
375 };
376
377 std::vector<SortCache> mSortCaches;
378
379 QgsAttributeEditorContext mEditorContext;
380
381 int mExtraColumns = 0;
382
384 bool mBulkEditCommandRunning = false;
385
387 bool mResettingModel = false;
388
390 void bulkEditCommandStarted();
391
393 void bulkEditCommandEnded();
394
396 QMap<QPair<QgsFeatureId, int>, QVariant> mAttributeValueChanges;
397
399 QList<QgsFeatureId> mInsertedRowsChanges;
400
402 bool mIsCleaningUpAfterRollback = false;
403
404 friend class TestQgsAttributeTable;
405
406};
407
408
409#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.
@ SortRole
Role used for sorting start here.
@ FieldIndexRole
Get the field index of this column.
@ UserRole
Start further roles starting from this role.
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.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:90
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:26