QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
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 // *INDENT-OFF*
55
63 {
64 FeatureId SIP_MONKEYPATCH_COMPAT_NAME( FeatureIdRole ) = Qt::UserRole,
65 FieldIndex SIP_MONKEYPATCH_COMPAT_NAME( FieldIndexRole ),
66 User SIP_MONKEYPATCH_COMPAT_NAME( UserRole ),
67 // Insert new values here, SortRole needs to be the last one
68 Sort SIP_MONKEYPATCH_COMPAT_NAME( SortRole ),
69 };
70 Q_ENUM( CustomRole )
71 // *INDENT-ON*
72
73 public:
79 QgsAttributeTableModel( QgsVectorLayerCache *layerCache, QObject *parent = nullptr );
80
85 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
86
91 int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
92
99 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
100
106 QVariant data( const QModelIndex &index, int role ) const override;
107
114 bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
115
120 Qt::ItemFlags flags( const QModelIndex &index ) const override;
121
127 void reload( const QModelIndex &index1, const QModelIndex &index2 );
128
132 bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override;
133
139 inline void resetModel() { loadLayer(); }
140
145 int idToRow( QgsFeatureId id ) const;
146
147 QModelIndex idToIndex( QgsFeatureId id ) const;
148
149 QModelIndexList idToIndexList( QgsFeatureId id ) const;
150
154 int fieldIdx( int col ) const;
155
159 int fieldCol( int idx ) const;
160
165 QgsFeatureId rowToId( int row ) const;
166
172 void swapRows( QgsFeatureId a, QgsFeatureId b );
173
177 inline QgsVectorLayer *layer() const { return mLayer; }
178
182 inline QgsVectorLayerCache *layerCache() const { return mLayerCache; }
183
187 void executeAction( QUuid action, const QModelIndex &idx ) const;
188
192 void executeMapLayerAction( QgsMapLayerAction *action, const QModelIndex &idx, const QgsMapLayerActionContext &context = QgsMapLayerActionContext() ) const;
193
198 QgsFeature feature( const QModelIndex &idx ) const;
199
207 void prefetchColumnData( int column );
208
215 void prefetchSortData( const QString &expression, unsigned long cacheIndex = 0 );
216
222 QString sortCacheExpression( unsigned long cacheIndex = 0 ) const;
223
231 void setRequest( const QgsFeatureRequest &request );
232
233 // TODO QGIS 4: return copy instead of reference
234
238 const QgsFeatureRequest &request() const;
239
246 void setEditorContext( const QgsAttributeEditorContext &context ) { mEditorContext = context; }
247
254 const QgsAttributeEditorContext &editorContext() const { return mEditorContext; }
255
260 int extraColumns() const;
261
266 void setExtraColumns( int extraColumns );
267
273 bool showValidityState() const { return mShowValidityState; }
274
280 void setShowValidityState( bool show ) { mShowValidityState = show; }
281
282 public slots:
283
288 virtual void loadLayer();
289
294 void fieldConditionalStyleChanged( const QString &fieldName );
295
296 signals:
297
302
304 void progress( int i, bool &cancel ) SIP_SKIP;
305
309 void finished();
310
311 private slots:
312
316 virtual void updatedFields();
317
323 virtual void editCommandEnded();
324
328 virtual void attributeDeleted( int idx );
329
336 virtual void attributeValueChanged( QgsFeatureId fid, int idx, const QVariant &value );
337
342 virtual void featuresDeleted( const QgsFeatureIds &fids );
343
348 virtual void featureAdded( QgsFeatureId fid );
349
353 virtual void layerDeleted();
354
355 virtual void fieldFormatterRemoved( QgsFieldFormatter *fieldFormatter );
356
357 private:
358 QgsVectorLayer *mLayer = nullptr;
359 QgsVectorLayerCache *mLayerCache = nullptr;
360 int mFieldCount = 0;
361
362 mutable QgsFeature mFeat;
363
364 QgsFields mFields;
365 QgsAttributeList mAttributes;
366
367 struct WidgetData
368 {
369 QgsFieldFormatter *fieldFormatter = nullptr;
370 QVariant cache;
371 QVariantMap config;
372 bool loaded = false;
373 };
374 mutable QVector<WidgetData> mWidgetDatas;
375
376 QHash<QgsFeatureId, int> mIdRowMap;
377 QHash<int, QgsFeatureId> mRowIdMap;
378 mutable QHash<QgsFeatureId, QList<QgsConditionalStyle>> mRowStylesMap;
379 mutable QHash<QgsFeatureId, QHash<int, QgsConditionalStyle>> mConstraintStylesMap;
380
381 mutable QgsExpressionContext mExpressionContext;
382
386 const WidgetData &getWidgetData( int column ) const;
387
391 void loadAttributes();
392
400 virtual bool loadFeatureAtId( QgsFeatureId fid ) const;
401
412 virtual bool loadFeatureAtId( QgsFeatureId fid, int fieldIdx ) const;
413
414 QgsFeatureRequest mFeatureRequest;
415
416 struct SortCache
417 {
419 int sortFieldIndex;
421 QgsExpression sortCacheExpression;
422 QgsAttributeList sortCacheAttributes;
424 QHash<QgsFeatureId, QVariant> sortCache;
425 };
426
427 std::vector<SortCache> mSortCaches;
428
429 QgsAttributeEditorContext mEditorContext;
430
431 int mExtraColumns = 0;
432
434 bool mBulkEditCommandRunning = false;
435
437 bool mResettingModel = false;
438
440 void bulkEditCommandStarted();
441
443 void bulkEditCommandEnded();
444
446 QMap<QPair<QgsFeatureId, int>, QVariant> mAttributeValueChanges;
447
449 QList<QgsFeatureId> mInsertedRowsChanges;
450
452 bool mIsCleaningUpAfterRollback = false;
453
454 bool mShowValidityState = false;
455
456 friend class TestQgsAttributeTable;
457};
458
459
460#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()
Emitted when the 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 finished()
Emitted when the model has completely loaded all features.
void setShowValidityState(bool show)
Sets whether the attribute table will add a visual feedback to cells when an attribute constraint is ...
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:58
A field formatter helps to handle and display values for a field.
Container of fields for a vector layer.
Definition qgsfields.h:46
Map canvas is a class for displaying all GIS data types on a canvas.
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
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QList< int > QgsAttributeList
Definition qgsfield.h:27