QGIS API Documentation 3.43.0-Master (c67cf405802)
qgsattributetableview.cpp
Go to the documentation of this file.
1/***************************************************************************
2 QgsAttributeTableView.cpp
3 --------------------------------------
4 Date : Feb 2009
5 Copyright : (C) 2009 Vita Cizek
6 Email : weetya (at) gmail.com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#include <QDesktopServices>
17#include <QKeyEvent>
18#include <QHeaderView>
19#include <QMenu>
20#include <QToolButton>
21#include <QHBoxLayout>
22
23#include "qgsactionmanager.h"
25#include "moc_qgsattributetableview.cpp"
29#include "qgsvectorlayer.h"
30#include "qgsvectorlayercache.h"
34#include "qgsfeatureiterator.h"
35#include "qgsstringutils.h"
36#include "qgsgui.h"
37#include "qgsmaplayeraction.h"
38
40 : QgsTableView( parent )
41{
42 const QgsSettings settings;
43 restoreGeometry( settings.value( QStringLiteral( "BetterAttributeTable/geometry" ) ).toByteArray() );
44
45 //verticalHeader()->setDefaultSectionSize( 20 );
46 horizontalHeader()->setHighlightSections( false );
47
48 // We need mouse move events to create the action button on hover
49 mTableDelegate = new QgsAttributeTableDelegate( this );
50 setItemDelegate( mTableDelegate );
51
52 setEditTriggers( QAbstractItemView::AllEditTriggers );
53
54 setSelectionBehavior( QAbstractItemView::SelectRows );
55 setSelectionMode( QAbstractItemView::ExtendedSelection );
56 setSortingEnabled( true ); // At this point no data is in the model yet, so actually nothing is sorted.
57 horizontalHeader()->setSortIndicatorShown( false ); // So hide the indicator to avoid confusion.
58
59 setHorizontalScrollMode( QAbstractItemView::ScrollPerPixel );
60
61 verticalHeader()->viewport()->installEventFilter( this );
62
63 connect( verticalHeader(), &QHeaderView::sectionPressed, this, [=]( int row ) { selectRow( row, true ); } );
64 connect( verticalHeader(), &QHeaderView::sectionEntered, this, &QgsAttributeTableView::_q_selectRow );
65 connect( horizontalHeader(), &QHeaderView::sectionResized, this, &QgsAttributeTableView::columnSizeChanged );
66 connect( horizontalHeader(), &QHeaderView::sortIndicatorChanged, this, &QgsAttributeTableView::showHorizontalSortIndicator );
67 connect( QgsGui::mapLayerActionRegistry(), &QgsMapLayerActionRegistry::changed, this, &QgsAttributeTableView::recreateActionWidgets );
68}
69
70bool QgsAttributeTableView::eventFilter( QObject *object, QEvent *event )
71{
72 if ( object == verticalHeader()->viewport() )
73 {
74 switch ( event->type() )
75 {
76 case QEvent::MouseButtonPress:
77 mFeatureSelectionModel->enableSync( false );
78 break;
79
80 case QEvent::MouseButtonRelease:
81 mFeatureSelectionModel->enableSync( true );
82 break;
83
84 default:
85 break;
86 }
87 }
88 return QTableView::eventFilter( object, event );
89}
90
92{
93 int i = 0;
94 const auto constColumns = config.columns();
95 QMap<QString, int> columns;
96 for ( const QgsAttributeTableConfig::ColumnConfig &columnConfig : constColumns )
97 {
98 if ( columnConfig.hidden )
99 continue;
100
101 if ( columnConfig.width >= 0 )
102 {
103 setColumnWidth( i, columnConfig.width );
104 }
105 else
106 {
107 setColumnWidth( i, horizontalHeader()->defaultSectionSize() );
108 }
109 columns.insert( columnConfig.name, i );
110 i++;
111 }
112 mConfig = config;
113 if ( config.sortExpression().isEmpty() )
114 {
115 horizontalHeader()->setSortIndicatorShown( false );
116 }
117 else
118 {
119 if ( mSortExpression != config.sortExpression() )
120 {
121 const QgsExpression sortExp { config.sortExpression() };
122 if ( sortExp.isField() )
123 {
124 const QStringList refCols { sortExp.referencedColumns().values() };
125 horizontalHeader()->setSortIndicatorShown( true );
126 horizontalHeader()->setSortIndicator( columns.value( refCols.constFirst() ), config.sortOrder() );
127 }
128 else
129 {
130 horizontalHeader()->setSortIndicatorShown( false );
131 }
132 }
133 }
134 mSortExpression = config.sortExpression();
135}
136
138{
139 // In order to get the ids in the right sorted order based on the view we have to get the feature ids first
140 // from the selection manager which is in the order the user selected them when clicking
141 // then get the model index, sort that, and finally return the new sorted features ids.
142 const QgsFeatureIds featureIds = mFeatureSelectionManager->selectedFeatureIds();
143 QModelIndexList indexList;
144 for ( const QgsFeatureId &id : featureIds )
145 {
146 const QModelIndex index = mFilterModel->fidToIndex( id );
147 indexList << index;
148 }
149
150 std::sort( indexList.begin(), indexList.end() );
151 QList<QgsFeatureId> ids;
152 for ( const QModelIndex &index : indexList )
153 {
154 const QgsFeatureId id = mFilterModel->data( index, static_cast<int>( QgsAttributeTableModel::CustomRole::FeatureId ) ).toLongLong();
155 ids.append( id );
156 }
157 return ids;
158}
159
161{
162 mFilterModel = filterModel;
163 QTableView::setModel( mFilterModel );
164
165 if ( mFilterModel )
166 {
167 connect( mFilterModel, &QObject::destroyed, this, &QgsAttributeTableView::modelDeleted );
168 connect( mTableDelegate, &QgsAttributeTableDelegate::actionColumnItemPainted, this, &QgsAttributeTableView::onActionColumnItemPainted );
169 }
170
171 delete mFeatureSelectionModel;
172 mFeatureSelectionModel = nullptr;
173
174 if ( mFilterModel )
175 {
176 if ( !mFeatureSelectionManager )
177 {
178 mOwnedFeatureSelectionManager = new QgsVectorLayerSelectionManager( mFilterModel->layer(), this );
179 mFeatureSelectionManager = mOwnedFeatureSelectionManager;
180 }
181
182 mFeatureSelectionModel = new QgsFeatureSelectionModel( mFilterModel, mFilterModel, mFeatureSelectionManager, mFilterModel );
183 setSelectionModel( mFeatureSelectionModel );
184 mTableDelegate->setFeatureSelectionModel( mFeatureSelectionModel );
185 connect( mFeatureSelectionModel, static_cast<void ( QgsFeatureSelectionModel::* )( const QModelIndexList &indexes )>( &QgsFeatureSelectionModel::requestRepaint ), this, static_cast<void ( QgsAttributeTableView::* )( const QModelIndexList &indexes )>( &QgsAttributeTableView::repaintRequested ) );
186 connect( mFeatureSelectionModel, static_cast<void ( QgsFeatureSelectionModel::* )()>( &QgsFeatureSelectionModel::requestRepaint ), this, static_cast<void ( QgsAttributeTableView::* )()>( &QgsAttributeTableView::repaintRequested ) );
187
188 connect( mFilterModel->layer(), &QgsVectorLayer::editingStarted, this, &QgsAttributeTableView::recreateActionWidgets );
189 connect( mFilterModel->layer(), &QgsVectorLayer::editingStopped, this, &QgsAttributeTableView::recreateActionWidgets );
190 connect( mFilterModel->layer(), &QgsVectorLayer::readOnlyChanged, this, &QgsAttributeTableView::recreateActionWidgets );
191 }
192}
193
195{
196 mFeatureSelectionManager = featureSelectionManager;
197
198 if ( mFeatureSelectionModel )
199 mFeatureSelectionModel->setFeatureSelectionManager( mFeatureSelectionManager );
200
201 // only delete the owner selection manager and not one created from outside
202 if ( mOwnedFeatureSelectionManager )
203 {
204 mOwnedFeatureSelectionManager->deleteLater();
205 mOwnedFeatureSelectionManager = nullptr;
206 }
207}
208
209QWidget *QgsAttributeTableView::createActionWidget( QgsFeatureId fid )
210{
211 const QgsAttributeTableConfig attributeTableConfig = mConfig;
212
213 QToolButton *toolButton = nullptr;
214 QWidget *container = nullptr;
215
216 if ( attributeTableConfig.actionWidgetStyle() == QgsAttributeTableConfig::DropDown )
217 {
218 toolButton = new QToolButton();
219 toolButton->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
220 toolButton->setPopupMode( QToolButton::MenuButtonPopup );
221 container = toolButton;
222 }
223 else
224 {
225 container = new QWidget();
226 container->setLayout( new QHBoxLayout() );
227 container->layout()->setContentsMargins( 0, 0, 0, 0 );
228 }
229
230 QList<QAction *> actionList;
231 QAction *defaultAction = nullptr;
232
233 // first add user created layer actions
234 const QList<QgsAction> actions = mFilterModel->layer()->actions()->actions( QStringLiteral( "Feature" ) );
235 const auto constActions = actions;
236 for ( const QgsAction &action : constActions )
237 {
238 if ( !mFilterModel->layer()->isEditable() && action.isEnabledOnlyWhenEditable() )
239 continue;
240
241 const QString actionTitle = !action.shortTitle().isEmpty() ? action.shortTitle() : action.icon().isNull() ? action.name()
242 : QString();
243 QAction *act = new QAction( action.icon(), actionTitle, container );
244 act->setToolTip( action.name() );
245 act->setData( "user_action" );
246 act->setProperty( "fid", fid );
247 act->setProperty( "action_id", action.id() );
248 connect( act, &QAction::triggered, this, &QgsAttributeTableView::actionTriggered );
249 actionList << act;
250
251 if ( mFilterModel->layer()->actions()->defaultAction( QStringLiteral( "Feature" ) ).id() == action.id() )
252 defaultAction = act;
253 }
254
256 const QList<QgsMapLayerAction *> mapLayerActions = QgsGui::mapLayerActionRegistry()->mapLayerActions( mFilterModel->layer(), Qgis::MapLayerActionTarget::SingleFeature, context );
257 // next add any registered actions for this layer
258 for ( QgsMapLayerAction *mapLayerAction : mapLayerActions )
259 {
260 QAction *action = new QAction( mapLayerAction->icon(), mapLayerAction->text(), container );
261 action->setData( "map_layer_action" );
262 action->setToolTip( mapLayerAction->text() );
263 action->setProperty( "fid", fid );
264 action->setProperty( "action", QVariant::fromValue( qobject_cast<QObject *>( mapLayerAction ) ) );
265 connect( action, &QAction::triggered, this, &QgsAttributeTableView::actionTriggered );
266 actionList << action;
267
268 if ( !defaultAction && QgsGui::mapLayerActionRegistry()->defaultActionForLayer( mFilterModel->layer() ) == mapLayerAction )
269 defaultAction = action;
270 }
271
272 if ( !defaultAction && !actionList.isEmpty() )
273 defaultAction = actionList.at( 0 );
274
275 const auto constActionList = actionList;
276 for ( QAction *act : constActionList )
277 {
278 if ( attributeTableConfig.actionWidgetStyle() == QgsAttributeTableConfig::DropDown )
279 {
280 toolButton->addAction( act );
281
282 if ( act == defaultAction )
283 toolButton->setDefaultAction( act );
284
285 container = toolButton;
286 }
287 else
288 {
289 QToolButton *btn = new QToolButton;
290 btn->setDefaultAction( act );
291 container->layout()->addWidget( btn );
292 }
293 }
294
295 if ( attributeTableConfig.actionWidgetStyle() == QgsAttributeTableConfig::ButtonList )
296 {
297 static_cast<QHBoxLayout *>( container->layout() )->addStretch();
298 }
299
300 // TODO: Rethink default actions
301#if 0
302 if ( toolButton && !toolButton->actions().isEmpty() && actions->defaultAction() == -1 )
303 toolButton->setDefaultAction( toolButton->actions().at( 0 ) );
304#endif
305
306 return container;
307}
308
310{
311 Q_UNUSED( e )
312 QgsSettings settings;
313 settings.setValue( QStringLiteral( "BetterAttributeTable/geometry" ), QVariant( saveGeometry() ) );
314}
315
317{
318 setSelectionMode( QAbstractItemView::NoSelection );
319 QTableView::mousePressEvent( event );
320 setSelectionMode( QAbstractItemView::ExtendedSelection );
321}
322
324{
325 setSelectionMode( QAbstractItemView::NoSelection );
326 QTableView::mouseReleaseEvent( event );
327 setSelectionMode( QAbstractItemView::ExtendedSelection );
328 if ( event->modifiers() == Qt::ControlModifier )
329 {
330 const QModelIndex index = indexAt( event->pos() );
331 const QVariant data = model()->data( index, Qt::DisplayRole );
332 if ( data.userType() == QMetaType::Type::QString )
333 {
334 const QString textVal = data.toString();
335 if ( QgsStringUtils::isUrl( textVal ) )
336 {
337 QDesktopServices::openUrl( QUrl( textVal ) );
338 }
339 }
340 }
341}
342
344{
345 setSelectionMode( QAbstractItemView::NoSelection );
346 QTableView::mouseMoveEvent( event );
347 setSelectionMode( QAbstractItemView::ExtendedSelection );
348}
349
351{
352 switch ( event->key() )
353 {
354 // Default Qt behavior would be to change the selection.
355 // We don't make it that easy for the user to trash his selection.
356 case Qt::Key_Up:
357 case Qt::Key_Down:
358 case Qt::Key_Left:
359 case Qt::Key_Right:
360 setSelectionMode( QAbstractItemView::NoSelection );
361 QTableView::keyPressEvent( event );
362 setSelectionMode( QAbstractItemView::ExtendedSelection );
363 break;
364
365 default:
366 QTableView::keyPressEvent( event );
367 break;
368 }
369}
370
371void QgsAttributeTableView::repaintRequested( const QModelIndexList &indexes )
372{
373 const auto constIndexes = indexes;
374 for ( const QModelIndex &index : constIndexes )
375 {
376 update( index );
377 }
378}
379
381{
382 setDirtyRegion( viewport()->rect() );
383}
384
386{
387 QItemSelection selection;
388 selection.append( QItemSelectionRange( mFilterModel->index( 0, 0 ), mFilterModel->index( mFilterModel->rowCount() - 1, 0 ) ) );
389 mFeatureSelectionModel->selectFeatures( selection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
390}
391
392void QgsAttributeTableView::contextMenuEvent( QContextMenuEvent *event )
393{
394 delete mActionPopup;
395 mActionPopup = nullptr;
396
397 const QModelIndex idx = mFilterModel->mapToMaster( indexAt( event->pos() ) );
398 if ( !idx.isValid() )
399 {
400 return;
401 }
402
403 QgsVectorLayer *vlayer = mFilterModel->layer();
404 if ( !vlayer )
405 return;
406
407 mActionPopup = new QMenu( this );
408
409 QAction *selectAllAction = mActionPopup->addAction( tr( "Select All" ) );
410 selectAllAction->setShortcut( QKeySequence::SelectAll );
411 connect( selectAllAction, &QAction::triggered, this, &QgsAttributeTableView::selectAll );
412
413 // let some other parts of the application add some actions
414 emit willShowContextMenu( mActionPopup, idx );
415
416 if ( !mActionPopup->actions().isEmpty() )
417 {
418 mActionPopup->popup( event->globalPos() );
419 }
420}
421
423{
424 selectRow( row, true );
425}
426
428{
429 selectRow( row, false );
430}
431
432void QgsAttributeTableView::modelDeleted()
433{
434 mFilterModel = nullptr;
435 mFeatureSelectionManager = nullptr;
436 mFeatureSelectionModel = nullptr;
437}
438
439void QgsAttributeTableView::selectRow( int row, bool anchor )
440{
441 if ( selectionBehavior() == QTableView::SelectColumns
442 || ( selectionMode() == QTableView::SingleSelection && selectionBehavior() == QTableView::SelectItems ) )
443 return;
444
445 if ( row >= 0 && row < model()->rowCount() )
446 {
447 const int column = horizontalHeader()->logicalIndexAt( isRightToLeft() ? viewport()->width() : 0 );
448 const QModelIndex index = model()->index( row, column );
449 QItemSelectionModel::SelectionFlags command = selectionCommand( index );
450 selectionModel()->setCurrentIndex( index, QItemSelectionModel::NoUpdate );
451 if ( ( anchor && !( command & QItemSelectionModel::Current ) )
452 || ( selectionMode() == QTableView::SingleSelection ) )
453 mRowSectionAnchor = row;
454
455 if ( selectionMode() != QTableView::SingleSelection
456 && command.testFlag( QItemSelectionModel::Toggle ) )
457 {
458 if ( anchor )
459 mCtrlDragSelectionFlag = mFeatureSelectionModel->isSelected( index )
460 ? QItemSelectionModel::Deselect
461 : QItemSelectionModel::Select;
462 command &= ~QItemSelectionModel::Toggle;
463 command |= mCtrlDragSelectionFlag;
464 if ( !anchor )
465 command |= QItemSelectionModel::Current;
466 }
467
468 const QModelIndex tl = model()->index( std::min( mRowSectionAnchor, row ), 0 );
469 const QModelIndex br = model()->index( std::max( mRowSectionAnchor, row ), model()->columnCount() - 1 );
470 if ( verticalHeader()->sectionsMoved() && tl.row() != br.row() )
471 setSelection( visualRect( tl ) | visualRect( br ), command );
472 else
473 mFeatureSelectionModel->selectFeatures( QItemSelection( tl, br ), command );
474 }
475}
476
477void QgsAttributeTableView::showHorizontalSortIndicator()
478{
479 horizontalHeader()->setSortIndicatorShown( true );
480}
481
482void QgsAttributeTableView::actionTriggered()
483{
484 QAction *action = qobject_cast<QAction *>( sender() );
485 const QgsFeatureId fid = action->property( "fid" ).toLongLong();
486
487 QgsFeature f;
488 mFilterModel->layerCache()->getFeatures( QgsFeatureRequest( fid ) ).nextFeature( f );
489
490 if ( action->data().toString() == QLatin1String( "user_action" ) )
491 {
492 mFilterModel->layer()->actions()->doAction( action->property( "action_id" ).toUuid(), f );
493 }
494 else if ( action->data().toString() == QLatin1String( "map_layer_action" ) )
495 {
496 QObject *object = action->property( "action" ).value<QObject *>();
497 QgsMapLayerAction *layerAction = qobject_cast<QgsMapLayerAction *>( object );
498 if ( layerAction )
499 {
502 layerAction->triggerForFeature( mFilterModel->layer(), f );
504 layerAction->triggerForFeature( mFilterModel->layer(), f, context );
505 }
506 }
507}
508
509void QgsAttributeTableView::columnSizeChanged( int index, int oldWidth, int newWidth )
510{
511 Q_UNUSED( oldWidth )
512 emit columnResized( index, newWidth );
513}
514
515void QgsAttributeTableView::onActionColumnItemPainted( const QModelIndex &index )
516{
517 if ( !indexWidget( index ) )
518 {
519 QWidget *widget = createActionWidget( mFilterModel->data( index, static_cast<int>( QgsAttributeTableModel::CustomRole::FeatureId ) ).toLongLong() );
520 mActionWidgets.insert( index, widget );
521 setIndexWidget( index, widget );
522 }
523}
524
525void QgsAttributeTableView::recreateActionWidgets()
526{
527 QMap<QModelIndex, QWidget *>::const_iterator it = mActionWidgets.constBegin();
528 for ( ; it != mActionWidgets.constEnd(); ++it )
529 {
530 // ownership of widget was transferred by initial call to setIndexWidget - clearing
531 // the index widget will delete the old widget safely
532 // they should then be recreated by onActionColumnItemPainted
533 setIndexWidget( it.key(), nullptr );
534 }
535 mActionWidgets.clear();
536}
537
539{
540 const QModelIndex index = mFilterModel->fidToIndex( fid );
541
542 if ( !index.isValid() )
543 return;
544
545 scrollTo( index );
546
547 const QModelIndex selectionIndex = index.sibling( index.row(), col );
548
549 if ( !selectionIndex.isValid() )
550 return;
551
552 selectionModel()->setCurrentIndex( index, QItemSelectionModel::SelectCurrent );
553}
554
556{
557 QWidget *editor = indexWidget( currentIndex() );
558 commitData( editor );
559 closeEditor( editor, QAbstractItemDelegate::NoHint );
560}
@ SingleFeature
Action targets a single feature from a layer.
QList< QgsAction > actions(const QString &actionScope=QString()) const
Returns a list of actions that are available in the given action scope.
void doAction(QUuid actionId, const QgsFeature &feature, int defaultValueIndex=0, const QgsExpressionContextScope &scope=QgsExpressionContextScope())
Does the given action.
QgsAction defaultAction(const QString &actionScope)
Each scope can have a default action.
Utility class that encapsulates an action based on vector attributes.
Definition qgsaction.h:37
QUuid id() const
Returns a unique id for this action.
Definition qgsaction.h:124
A container for configuration of the attribute table.
Qt::SortOrder sortOrder() const
Gets the sort order.
QVector< QgsAttributeTableConfig::ColumnConfig > columns() const
Gets the list with all columns and their configuration.
@ DropDown
A tool button with a drop-down to select the current action.
ActionWidgetStyle actionWidgetStyle() const
Gets the style of the action widget.
QString sortExpression() const
Gets the expression used for sorting.
A delegate item class for QgsAttributeTable (see Qt documentation for QItemDelegate).
void actionColumnItemPainted(const QModelIndex &index) const
Emitted when an action column item is painted.
void setFeatureSelectionModel(QgsFeatureSelectionModel *featureSelectionModel)
A proxy model for filtering an attribute table model.
QgsVectorLayerCache * layerCache() const
Returns the layerCache this filter acts on.
QModelIndex fidToIndex(QgsFeatureId fid) override
QVariant data(const QModelIndex &index, int role) const override
QModelIndex mapToMaster(const QModelIndex &proxyIndex) const
QgsVectorLayer * layer() const
Returns the layer this filter acts on.
@ FeatureId
Get the feature id of the feature in this row.
Provides a table view of features of a QgsVectorLayer.
void willShowContextMenu(QMenu *menu, const QModelIndex &atIndex)
Emitted in order to provide a hook to add additional* menu entries to the context menu.
QList< QgsFeatureId > selectedFeaturesIds() const
Returns the selected features in the attribute table in table sorted order.
void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
setFeatureSelectionManager
void mouseMoveEvent(QMouseEvent *event) override
Called for mouse move events on a table cell.
virtual void selectRow(int row)
QgsAttributeTableView(QWidget *parent=nullptr)
Constructor for QgsAttributeTableView.
void scrollToFeature(const QgsFeatureId &fid, int column=-1)
Scroll to a feature with a given fid.
void mouseReleaseEvent(QMouseEvent *event) override
Called for mouse release events on a table cell.
void contextMenuEvent(QContextMenuEvent *event) override
Is called when the context menu will be shown.
virtual void _q_selectRow(int row)
void closeEvent(QCloseEvent *event) override
Saves geometry to the settings on close.
void mousePressEvent(QMouseEvent *event) override
Called for mouse press events on a table cell.
void closeCurrentEditor()
Closes the editor delegate for the current item, committing its changes to the model.
void keyPressEvent(QKeyEvent *event) override
Called for key press events Disables selection change by only pressing an arrow key.
void setAttributeTableConfig(const QgsAttributeTableConfig &config)
Set the attribute table config which should be used to control the appearance of the attribute table.
void columnResized(int column, int width)
Emitted when a column in the view has been resized.
bool eventFilter(QObject *object, QEvent *event) override
This event filter is installed on the verticalHeader to intercept mouse press and release events.
virtual void setModel(QgsAttributeTableFilterModel *filterModel)
Handles parsing and evaluation of expressions (formerly called "search strings").
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Wraps a request for features to a vector layer (or directly its vector data provider).
Item selection model for selecting features.
void enableSync(bool enable)
Enables or disables synchronisation to the QgsVectorLayer When synchronisation is disabled,...
virtual void selectFeatures(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command)
Select features on this table.
virtual bool isSelected(QgsFeatureId fid)
Returns the selection status of a given feature id.
virtual void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
void requestRepaint()
Request a repaint of the visible items of connected views.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
static QgsMapLayerActionRegistry * mapLayerActionRegistry()
Returns the global map layer action registry, used for registering map layer actions.
Definition qgsgui.cpp:135
Is an interface class to abstract feature selection handling.
virtual const QgsFeatureIds & selectedFeatureIds() const =0
Returns reference to identifiers of selected features.
Encapsulates the context in which a QgsMapLayerAction action is executed.
void changed()
Triggered when an action is added or removed from the registry.
QList< QgsMapLayerAction * > mapLayerActions(QgsMapLayer *layer, Qgis::MapLayerActionTargets targets=Qgis::MapLayerActionTarget::AllActions, const QgsMapLayerActionContext &context=QgsMapLayerActionContext())
Returns the map layer actions which can run on the specified layer.
An action which can run on map layers.
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
void editingStarted()
Emitted when editing on this layer has started.
Stores settings for use within QGIS.
Definition qgssettings.h:66
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
static bool isUrl(const QString &string)
Returns whether the string is a URL (http,https,ftp,file)
A QTableView subclass with QGIS specific tweaks and improvements.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &featureRequest=QgsFeatureRequest())
Query this VectorLayerCache for features.
Represents a vector layer which manages a vector based dataset.
bool isEditable() const FINAL
Returns true if the provider is in editing mode.
QgsActionManager * actions()
Returns all layer actions defined on this layer.
void readOnlyChanged()
Emitted when the read only state of this layer is changed.
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:6819
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:6818
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Defines the configuration of a column in the attribute table.