QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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
55 // *INDENT-OFF*
56
64 {
65 FeatureId SIP_MONKEYPATCH_COMPAT_NAME(FeatureIdRole)= Qt::UserRole,
66 FieldIndex SIP_MONKEYPATCH_COMPAT_NAME(FieldIndexRole),
67 User SIP_MONKEYPATCH_COMPAT_NAME(UserRole),
68 // Insert new values here, SortRole needs to be the last one
69 Sort SIP_MONKEYPATCH_COMPAT_NAME(SortRole),
70 };
71 Q_ENUM( CustomRole )
72 // *INDENT-ON*
73
74 public:
75
81 QgsAttributeTableModel( QgsVectorLayerCache *layerCache, QObject *parent = nullptr );
82
87 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
88
93 int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
94
101 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
102
108 QVariant data( const QModelIndex &index, int role ) const override;
109
116 bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
117
122 Qt::ItemFlags flags( const QModelIndex &index ) const override;
123
129 void reload( const QModelIndex &index1, const QModelIndex &index2 );
130
134 bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override;
135
141 inline void resetModel() { loadLayer(); }
142
147 int idToRow( QgsFeatureId id ) const;
148
149 QModelIndex idToIndex( QgsFeatureId id ) const;
150
151 QModelIndexList idToIndexList( QgsFeatureId id ) const;
152
156 int fieldIdx( int col ) const;
157
161 int fieldCol( int idx ) const;
162
167 QgsFeatureId rowToId( int row ) const;
168
174 void swapRows( QgsFeatureId a, QgsFeatureId b );
175
179 inline QgsVectorLayer *layer() const { return mLayer; }
180
184 inline QgsVectorLayerCache *layerCache() const { return mLayerCache; }
185
189 void executeAction( QUuid action, const QModelIndex &idx ) const;
190
194 void executeMapLayerAction( QgsMapLayerAction *action, const QModelIndex &idx, const QgsMapLayerActionContext &context = QgsMapLayerActionContext() ) const;
195
200 QgsFeature feature( const QModelIndex &idx ) const;
201
209 void prefetchColumnData( int column );
210
217 void prefetchSortData( const QString &expression, unsigned long cacheIndex = 0 );
218
224 QString sortCacheExpression( unsigned long cacheIndex = 0 ) const;
225
233 void setRequest( const QgsFeatureRequest &request );
234
235 // TODO QGIS 4: return copy instead of reference
236
240 const QgsFeatureRequest &request() const;
241
248 void setEditorContext( const QgsAttributeEditorContext &context ) { mEditorContext = context; }
249
256 const QgsAttributeEditorContext &editorContext() const { return mEditorContext; }
257
262 int extraColumns() const;
263
268 void setExtraColumns( int extraColumns );
269
275 bool showValidityState() const { return mShowValidityState; }
276
282 void setShowValidityState( bool show ) { mShowValidityState = show; }
283
284 public slots:
285
290 virtual void loadLayer();
291
296 void fieldConditionalStyleChanged( const QString &fieldName );
297
298 signals:
299
304
306 void progress( int i, bool &cancel ) SIP_SKIP;
307 void finished();
308
309 private slots:
310
314 virtual void updatedFields();
315
321 virtual void editCommandEnded();
322
326 virtual void attributeDeleted( int idx );
327
334 virtual void attributeValueChanged( QgsFeatureId fid, int idx, const QVariant &value );
335
340 virtual void featuresDeleted( const QgsFeatureIds &fids );
341
346 virtual void featureAdded( QgsFeatureId fid );
347
351 virtual void layerDeleted();
352
353 virtual void fieldFormatterRemoved( QgsFieldFormatter *fieldFormatter );
354
355 private:
356 QgsVectorLayer *mLayer = nullptr;
357 QgsVectorLayerCache *mLayerCache = nullptr;
358 int mFieldCount = 0;
359
360 mutable QgsFeature mFeat;
361
362 QgsFields mFields;
363 QgsAttributeList mAttributes;
364
365 struct WidgetData
366 {
367 QgsFieldFormatter *fieldFormatter = nullptr;
368 QVariant cache;
369 QVariantMap config;
370 bool loaded = false;
371 };
372 mutable QVector<WidgetData> mWidgetDatas;
373
374 QHash<QgsFeatureId, int> mIdRowMap;
375 QHash<int, QgsFeatureId> mRowIdMap;
376 mutable QHash<QgsFeatureId, QList<QgsConditionalStyle> > mRowStylesMap;
377 mutable QHash<QgsFeatureId, QHash<int, QgsConditionalStyle> > mConstraintStylesMap;
378
379 mutable QgsExpressionContext mExpressionContext;
380
384 const WidgetData &getWidgetData( int column ) const;
385
389 void loadAttributes();
390
398 virtual bool loadFeatureAtId( QgsFeatureId fid ) const;
399
410 virtual bool loadFeatureAtId( QgsFeatureId fid, int fieldIdx ) const;
411
412 QgsFeatureRequest mFeatureRequest;
413
414 struct SortCache
415 {
417 int sortFieldIndex;
419 QgsExpression sortCacheExpression;
420 QgsAttributeList sortCacheAttributes;
422 QHash<QgsFeatureId, QVariant> sortCache;
423 };
424
425 std::vector<SortCache> mSortCaches;
426
427 QgsAttributeEditorContext mEditorContext;
428
429 int mExtraColumns = 0;
430
432 bool mBulkEditCommandRunning = false;
433
435 bool mResettingModel = false;
436
438 void bulkEditCommandStarted();
439
441 void bulkEditCommandEnded();
442
444 QMap<QPair<QgsFeatureId, int>, QVariant> mAttributeValueChanges;
445
447 QList<QgsFeatureId> mInsertedRowsChanges;
448
450 bool mIsCleaningUpAfterRollback = false;
451
452 bool mShowValidityState = false;
453
454 friend class TestQgsAttributeTable;
455
456};
457
458
459#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 ...
CustomRole
Custom model roles.
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:93
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
#define SIP_MONKEYPATCH_SCOPEENUM_UNNEST(OUTSIDE_CLASS, FORMERNAME)
Definition: qgis_sip.h:271
#define SIP_MONKEYPATCH_COMPAT_NAME(FORMERNAME)
Definition: qgis_sip.h:273
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