QGIS API Documentation 4.3.0-Master (16eddb2670e)
Loading...
Searching...
No Matches
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
17
18#include "qgsactionmanager.h"
22#include "qgsfeatureiterator.h"
24#include "qgsgui.h"
25#include "qgsmaplayeraction.h"
27#include "qgsstringutils.h"
28#include "qgsvectorlayer.h"
29#include "qgsvectorlayercache.h"
31
32#include <QDesktopServices>
33#include <QHBoxLayout>
34#include <QHeaderView>
35#include <QKeyEvent>
36#include <QMenu>
37#include <QString>
38#include <QToolButton>
39
40#include "moc_qgsattributetableview.cpp"
41
42using namespace Qt::StringLiterals;
43
45 : QgsTableView( parent )
46{
47 const QgsSettings settings;
48 restoreGeometry( settings.value( u"BetterAttributeTable/geometry"_s ).toByteArray() );
49
50 //verticalHeader()->setDefaultSectionSize( 20 );
51 horizontalHeader()->setHighlightSections( false );
52
53 // We need mouse move events to create the action button on hover
54 mTableDelegate = new QgsAttributeTableDelegate( this );
55 setItemDelegate( mTableDelegate );
56
57 setEditTriggers( QAbstractItemView::AllEditTriggers );
58
59 setSelectionBehavior( QAbstractItemView::SelectRows );
60 setSelectionMode( QAbstractItemView::ExtendedSelection );
61 setSortingEnabled( true ); // At this point no data is in the model yet, so actually nothing is sorted.
62 horizontalHeader()->setSortIndicatorShown( false ); // So hide the indicator to avoid confusion.
63
64 setHorizontalScrollMode( QAbstractItemView::ScrollPerPixel );
65
66 verticalHeader()->viewport()->installEventFilter( this );
67
68 connect( verticalHeader(), &QHeaderView::sectionPressed, this, [this]( int row ) { selectRow( row, true ); } );
69 connect( verticalHeader(), &QHeaderView::sectionEntered, this, &QgsAttributeTableView::_q_selectRow );
70 connect( horizontalHeader(), &QHeaderView::sectionResized, this, &QgsAttributeTableView::columnSizeChanged );
71 connect( horizontalHeader(), &QHeaderView::sortIndicatorChanged, this, &QgsAttributeTableView::showHorizontalSortIndicator );
72 connect( QgsGui::mapLayerActionRegistry(), &QgsMapLayerActionRegistry::changed, this, &QgsAttributeTableView::recreateActionWidgets );
73}
74
75bool QgsAttributeTableView::eventFilter( QObject *object, QEvent *event )
76{
77 if ( object == verticalHeader()->viewport() )
78 {
79 switch ( event->type() )
80 {
81 case QEvent::MouseButtonPress:
82 mFeatureSelectionModel->enableSync( false );
83 break;
84
85 case QEvent::MouseButtonRelease:
86 mFeatureSelectionModel->enableSync( true );
87 break;
88
89 case QEvent::MouseButtonDblClick:
90 {
91 QMouseEvent *mouseEvent = static_cast<QMouseEvent *>( event );
92 if ( mouseEvent->button() == Qt::LeftButton )
93 {
94 const int row = verticalHeader()->logicalIndexAt( mouseEvent->pos() );
95 if ( row >= 0 && mFilterModel )
96 {
97 const QModelIndex index = mFilterModel->index( row, 0 );
98 if ( index.isValid() )
99 {
100 const QgsFeatureId fid = mFilterModel->rowToId( index );
101 emit rowHeaderDoubleClicked( fid );
102 }
103 }
104 }
105 break;
106 }
107
108 default:
109 break;
110 }
111 }
112 return QTableView::eventFilter( object, event );
113}
114
116{
117 if ( mBlockColumnUpdates )
118 return;
119
120 ScopedIntIncrementor blockSignals( &mBlockColumnUpdates );
121 int i = 0;
122 const auto constColumns = config.columns();
123 QMap<QString, int> columns;
124 for ( const QgsAttributeTableConfig::ColumnConfig &columnConfig : constColumns )
125 {
126 if ( columnConfig.hidden )
127 continue;
128
129 if ( columnConfig.width >= 0 )
130 {
131 setColumnWidth( i, columnConfig.width );
132 }
133 else
134 {
135 setColumnWidth( i, horizontalHeader()->defaultSectionSize() );
136 }
137 columns.insert( columnConfig.name, i );
138 i++;
139 }
140 mConfig = config;
141 if ( config.sortExpression().isEmpty() )
142 {
143 horizontalHeader()->setSortIndicatorShown( false );
144 }
145 else
146 {
147 if ( mSortExpression != config.sortExpression() )
148 {
149 const QgsExpression sortExp { config.sortExpression() };
150 if ( sortExp.isField() )
151 {
152 const QStringList refCols { sortExp.referencedColumns().values() };
153 horizontalHeader()->setSortIndicatorShown( true );
154 horizontalHeader()->setSortIndicator( columns.value( refCols.constFirst() ), config.sortOrder() );
155 }
156 else
157 {
158 horizontalHeader()->setSortIndicatorShown( false );
159 }
160 }
161 }
162 mSortExpression = config.sortExpression();
163}
164
166{
167 // In order to get the ids in the right sorted order based on the view we have to get the feature ids first
168 // from the selection manager which is in the order the user selected them when clicking
169 // then get the model index, sort that, and finally return the new sorted features ids.
170 const QgsFeatureIds featureIds = mFeatureSelectionManager->selectedFeatureIds();
171 QModelIndexList indexList;
172 for ( const QgsFeatureId &id : featureIds )
173 {
174 const QModelIndex index = mFilterModel->fidToIndex( id );
175 indexList << index;
176 }
177
178 std::sort( indexList.begin(), indexList.end() );
179 QList<QgsFeatureId> ids;
180 for ( const QModelIndex &index : indexList )
181 {
182 const QgsFeatureId id = mFilterModel->data( index, static_cast<int>( QgsAttributeTableModel::CustomRole::FeatureId ) ).toLongLong();
183 ids.append( id );
184 }
185 return ids;
186}
187
189{
190 mFilterModel = filterModel;
191 QTableView::setModel( mFilterModel );
192
193 if ( mFilterModel )
194 {
195 connect( mFilterModel, &QObject::destroyed, this, &QgsAttributeTableView::modelDeleted );
196 connect( mTableDelegate, &QgsAttributeTableDelegate::actionColumnItemPainted, this, &QgsAttributeTableView::onActionColumnItemPainted );
197 }
198
199 delete mFeatureSelectionModel;
200 mFeatureSelectionModel = nullptr;
201
202 if ( mFilterModel )
203 {
204 if ( !mFeatureSelectionManager )
205 {
206 mOwnedFeatureSelectionManager = new QgsVectorLayerSelectionManager( mFilterModel->layer(), this );
207 mFeatureSelectionManager = mOwnedFeatureSelectionManager;
208 }
209
210 mFeatureSelectionModel = new QgsFeatureSelectionModel( mFilterModel, mFilterModel, mFeatureSelectionManager, mFilterModel );
211 setSelectionModel( mFeatureSelectionModel );
212 mTableDelegate->setFeatureSelectionModel( mFeatureSelectionModel );
213 connect(
214 mFeatureSelectionModel,
215 static_cast<void ( QgsFeatureSelectionModel::* )( const QModelIndexList &indexes )>( &QgsFeatureSelectionModel::requestRepaint ),
216 this,
217 static_cast<void ( QgsAttributeTableView::* )( const QModelIndexList &indexes )>( &QgsAttributeTableView::repaintRequested )
218 );
219 connect( mFeatureSelectionModel, static_cast<void ( QgsFeatureSelectionModel::* )()>( &QgsFeatureSelectionModel::requestRepaint ), this, static_cast<void ( QgsAttributeTableView::* )()>( &QgsAttributeTableView::repaintRequested ) );
220
221 connect( mFilterModel->layer(), &QgsVectorLayer::editingStarted, this, &QgsAttributeTableView::recreateActionWidgets );
222 connect( mFilterModel->layer(), &QgsVectorLayer::editingStopped, this, &QgsAttributeTableView::recreateActionWidgets );
223 connect( mFilterModel->layer(), &QgsVectorLayer::readOnlyChanged, this, &QgsAttributeTableView::recreateActionWidgets );
224 }
225}
226
228{
229 mFeatureSelectionManager = featureSelectionManager;
230
231 if ( mFeatureSelectionModel )
232 mFeatureSelectionModel->setFeatureSelectionManager( mFeatureSelectionManager );
233
234 // only delete the owner selection manager and not one created from outside
235 if ( mOwnedFeatureSelectionManager )
236 {
237 mOwnedFeatureSelectionManager->deleteLater();
238 mOwnedFeatureSelectionManager = nullptr;
239 }
240}
241
242QWidget *QgsAttributeTableView::createActionWidget( QgsFeatureId fid )
243{
244 const QgsAttributeTableConfig attributeTableConfig = mConfig;
245
246 QToolButton *toolButton = nullptr;
247 QWidget *container = nullptr;
248
249 if ( attributeTableConfig.actionWidgetStyle() == QgsAttributeTableConfig::DropDown )
250 {
251 toolButton = new QToolButton();
252 toolButton->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
253 toolButton->setPopupMode( QToolButton::MenuButtonPopup );
254 container = toolButton;
255 }
256 else
257 {
258 container = new QWidget();
259 container->setLayout( new QHBoxLayout() );
260 container->layout()->setContentsMargins( 0, 0, 0, 0 );
261 }
262
263 QList<QAction *> actionList;
264 QAction *defaultAction = nullptr;
265
266 // first add user created layer actions
267 const QList<QgsAction> actions = mFilterModel->layer()->actions()->actions( u"Feature"_s );
268 const auto constActions = actions;
269 for ( const QgsAction &action : constActions )
270 {
271 if ( !mFilterModel->layer()->isEditable() && action.isEnabledOnlyWhenEditable() )
272 continue;
273
274 const QString actionTitle = !action.shortTitle().isEmpty() ? action.shortTitle() : action.icon().isNull() ? action.name() : QString();
275 QAction *act = new QAction( action.icon(), actionTitle, container );
276 act->setToolTip( action.name() );
277 act->setData( "user_action" );
278 act->setProperty( "fid", fid );
279 act->setProperty( "action_id", action.id() );
280 connect( act, &QAction::triggered, this, &QgsAttributeTableView::actionTriggered );
281 actionList << act;
282
283 if ( mFilterModel->layer()->actions()->defaultAction( u"Feature"_s ).id() == action.id() )
284 defaultAction = act;
285 }
286
287 QgsMapLayerActionContext context;
288 const QList<QgsMapLayerAction *> mapLayerActions = QgsGui::mapLayerActionRegistry()->mapLayerActions( mFilterModel->layer(), Qgis::MapLayerActionTarget::SingleFeature, context );
289 // next add any registered actions for this layer
290 for ( QgsMapLayerAction *mapLayerAction : mapLayerActions )
291 {
292 QAction *action = new QAction( mapLayerAction->icon(), mapLayerAction->text(), container );
293 action->setData( "map_layer_action" );
294 action->setToolTip( mapLayerAction->text() );
295 action->setProperty( "fid", fid );
296 action->setProperty( "action", QVariant::fromValue( qobject_cast<QObject *>( mapLayerAction ) ) );
297 connect( action, &QAction::triggered, this, &QgsAttributeTableView::actionTriggered );
298 actionList << action;
299
300 if ( !defaultAction && QgsGui::mapLayerActionRegistry()->defaultActionForLayer( mFilterModel->layer() ) == mapLayerAction )
301 defaultAction = action;
302 }
303
304 if ( !defaultAction && !actionList.isEmpty() )
305 defaultAction = actionList.at( 0 );
306
307 const auto constActionList = actionList;
308 for ( QAction *act : constActionList )
309 {
310 if ( attributeTableConfig.actionWidgetStyle() == QgsAttributeTableConfig::DropDown )
311 {
312 toolButton->addAction( act );
313
314 if ( act == defaultAction )
315 toolButton->setDefaultAction( act );
316
317 container = toolButton;
318 }
319 else
320 {
321 QToolButton *btn = new QToolButton;
322 btn->setDefaultAction( act );
323 container->layout()->addWidget( btn );
324 }
325 }
326
327 if ( attributeTableConfig.actionWidgetStyle() == QgsAttributeTableConfig::ButtonList )
328 {
329 static_cast<QHBoxLayout *>( container->layout() )->addStretch();
330 }
331
332 // TODO: Rethink default actions
333#if 0
334 if ( toolButton && !toolButton->actions().isEmpty() && actions->defaultAction() == -1 )
335 toolButton->setDefaultAction( toolButton->actions().at( 0 ) );
336#endif
337
338 return container;
339}
340
342{
343 Q_UNUSED( e )
344 QgsSettings settings;
345 settings.setValue( u"BetterAttributeTable/geometry"_s, QVariant( saveGeometry() ) );
346}
347
349{
350 setSelectionMode( QAbstractItemView::NoSelection );
351 QTableView::mousePressEvent( event );
352 setSelectionMode( QAbstractItemView::ExtendedSelection );
353}
354
356{
357 setSelectionMode( QAbstractItemView::NoSelection );
358 QTableView::mouseReleaseEvent( event );
359 setSelectionMode( QAbstractItemView::ExtendedSelection );
360 if ( event->modifiers() == Qt::ControlModifier )
361 {
362 const QModelIndex index = indexAt( event->pos() );
363 const QVariant data = model()->data( index, Qt::DisplayRole );
364 if ( data.userType() == QMetaType::Type::QString )
365 {
366 const QString textVal = data.toString();
367 if ( QgsStringUtils::isUrl( textVal ) )
368 {
369 QDesktopServices::openUrl( QUrl( textVal ) );
370 }
371 }
372 }
373}
374
376{
377 setSelectionMode( QAbstractItemView::NoSelection );
378 QTableView::mouseMoveEvent( event );
379 setSelectionMode( QAbstractItemView::ExtendedSelection );
380}
381
383{
384 switch ( event->key() )
385 {
386 // Default Qt behavior would be to change the selection.
387 // We don't make it that easy for the user to trash his selection.
388 case Qt::Key_Up:
389 case Qt::Key_Down:
390 case Qt::Key_Left:
391 case Qt::Key_Right:
392 setSelectionMode( QAbstractItemView::NoSelection );
393 QTableView::keyPressEvent( event );
394 setSelectionMode( QAbstractItemView::ExtendedSelection );
395 break;
396
397 default:
398 QTableView::keyPressEvent( event );
399 break;
400 }
401}
402
403void QgsAttributeTableView::repaintRequested( const QModelIndexList &indexes )
404{
405 const auto constIndexes = indexes;
406 for ( const QModelIndex &index : constIndexes )
407 {
408 update( index );
409 }
410}
411
413{
414 setDirtyRegion( viewport()->rect() );
415}
416
418{
419 QItemSelection selection;
420 selection.append( QItemSelectionRange( mFilterModel->index( 0, 0 ), mFilterModel->index( mFilterModel->rowCount() - 1, 0 ) ) );
421 mFeatureSelectionModel->selectFeatures( selection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
422}
423
424void QgsAttributeTableView::contextMenuEvent( QContextMenuEvent *event )
425{
426 delete mActionPopup;
427 mActionPopup = nullptr;
428
429 const QModelIndex idx = mFilterModel->mapToMaster( indexAt( event->pos() ) );
430 if ( !idx.isValid() )
431 {
432 return;
433 }
434
435 QgsVectorLayer *vlayer = mFilterModel->layer();
436 if ( !vlayer )
437 return;
438
439 mActionPopup = new QMenu( this );
440
441 QAction *selectAllAction = mActionPopup->addAction( tr( "Select All" ) );
442 selectAllAction->setShortcut( QKeySequence::SelectAll );
443 connect( selectAllAction, &QAction::triggered, this, &QgsAttributeTableView::selectAll );
444
445 // let some other parts of the application add some actions
446 emit willShowContextMenu( mActionPopup, idx );
447
448 if ( !mActionPopup->actions().isEmpty() )
449 {
450 mActionPopup->popup( event->globalPos() );
451 }
452}
453
455{
456 selectRow( row, true );
457}
458
460{
461 selectRow( row, false );
462}
463
464void QgsAttributeTableView::modelDeleted()
465{
466 mFilterModel = nullptr;
467 mFeatureSelectionManager = nullptr;
468 mFeatureSelectionModel = nullptr;
469}
470
471void QgsAttributeTableView::selectRow( int row, bool anchor )
472{
473 if ( selectionBehavior() == QTableView::SelectColumns || ( selectionMode() == QTableView::SingleSelection && selectionBehavior() == QTableView::SelectItems ) )
474 return;
475
476 if ( row >= 0 && row < model()->rowCount() )
477 {
478 const int column = horizontalHeader()->logicalIndexAt( isRightToLeft() ? viewport()->width() : 0 );
479 const QModelIndex index = model()->index( row, column );
480 QItemSelectionModel::SelectionFlags command = selectionCommand( index );
481 selectionModel()->setCurrentIndex( index, QItemSelectionModel::NoUpdate );
482 if ( ( anchor && !( command & QItemSelectionModel::Current ) ) || ( selectionMode() == QTableView::SingleSelection ) )
483 mRowSectionAnchor = row;
484
485 if ( selectionMode() != QTableView::SingleSelection && command.testFlag( QItemSelectionModel::Toggle ) )
486 {
487 if ( anchor )
488 mCtrlDragSelectionFlag = mFeatureSelectionModel->isSelected( index ) ? QItemSelectionModel::Deselect : QItemSelectionModel::Select;
489 command &= ~QItemSelectionModel::Toggle;
490 command |= mCtrlDragSelectionFlag;
491 if ( !anchor )
492 command |= QItemSelectionModel::Current;
493 }
494
495 const QModelIndex tl = model()->index( std::min( mRowSectionAnchor, row ), 0 );
496 const QModelIndex br = model()->index( std::max( mRowSectionAnchor, row ), model()->columnCount() - 1 );
497 if ( verticalHeader()->sectionsMoved() && tl.row() != br.row() )
498 setSelection( visualRect( tl ) | visualRect( br ), command );
499 else
500 mFeatureSelectionModel->selectFeatures( QItemSelection( tl, br ), command );
501 }
502}
503
504void QgsAttributeTableView::showHorizontalSortIndicator()
505{
506 horizontalHeader()->setSortIndicatorShown( true );
507}
508
509void QgsAttributeTableView::actionTriggered()
510{
511 QAction *action = qobject_cast<QAction *>( sender() );
512 const QgsFeatureId fid = action->property( "fid" ).toLongLong();
513
514 QgsFeature f;
515 mFilterModel->layerCache()->getFeatures( QgsFeatureRequest( fid ) ).nextFeature( f );
516
517 if ( action->data().toString() == "user_action"_L1 )
518 {
519 mFilterModel->layer()->actions()->doAction( action->property( "action_id" ).toUuid(), f );
520 }
521 else if ( action->data().toString() == "map_layer_action"_L1 )
522 {
523 QObject *object = action->property( "action" ).value<QObject *>();
524 QgsMapLayerAction *layerAction = qobject_cast<QgsMapLayerAction *>( object );
525 if ( layerAction )
526 {
527 QgsMapLayerActionContext context;
529 layerAction->triggerForFeature( mFilterModel->layer(), f );
531 layerAction->triggerForFeature( mFilterModel->layer(), f, context );
532 }
533 }
534}
535
536void QgsAttributeTableView::columnSizeChanged( int index, int oldWidth, int newWidth )
537{
538 if ( mBlockColumnUpdates )
539 return;
540
541 Q_UNUSED( oldWidth )
542
543 ScopedIntIncrementor blockSignals( &mBlockColumnUpdates );
544 emit columnResized( index, newWidth );
545}
546
547void QgsAttributeTableView::onActionColumnItemPainted( const QModelIndex &index )
548{
549 if ( !indexWidget( index ) )
550 {
551 QWidget *widget = createActionWidget( mFilterModel->data( index, static_cast<int>( QgsAttributeTableModel::CustomRole::FeatureId ) ).toLongLong() );
552 mActionWidgets.insert( index, widget );
553 setIndexWidget( index, widget );
554 }
555}
556
557void QgsAttributeTableView::recreateActionWidgets()
558{
559 QMap<QModelIndex, QWidget *>::const_iterator it = mActionWidgets.constBegin();
560 for ( ; it != mActionWidgets.constEnd(); ++it )
561 {
562 // ownership of widget was transferred by initial call to setIndexWidget - clearing
563 // the index widget will delete the old widget safely
564 // they should then be recreated by onActionColumnItemPainted
565 setIndexWidget( it.key(), nullptr );
566 }
567 mActionWidgets.clear();
568}
569
571{
572 const QModelIndex index = mFilterModel->fidToIndex( fid );
573
574 if ( !index.isValid() )
575 return;
576
577 scrollTo( index );
578
579 const QModelIndex selectionIndex = index.sibling( index.row(), col );
580
581 if ( !selectionIndex.isValid() )
582 return;
583
584 selectionModel()->setCurrentIndex( index, QItemSelectionModel::SelectCurrent );
585}
586
588{
589 QWidget *editor = indexWidget( currentIndex() );
590 commitData( editor );
591 closeEditor( editor, QAbstractItemDelegate::NoHint );
592}
@ SingleFeature
Action targets a single feature from a layer.
Definition qgis.h:5167
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.
A proxy model for filtering an attribute table model.
@ FeatureId
Get the feature id of the feature in this row.
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 rowHeaderDoubleClicked(QgsFeatureId fid)
Emitted when a row header is double-clicked.
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.
void repaintRequested(const QModelIndexList &indexes)
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 isField() const
Checks whether an expression consists only of a single field reference.
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
Item selection model for selecting features.
void requestRepaint(const QModelIndexList &indexes)
Request a repaint of a list of model indexes.
static QgsMapLayerActionRegistry * mapLayerActionRegistry()
Returns the global map layer action registry, used for registering map layer actions.
Definition qgsgui.cpp:150
Is an interface class to abstract feature selection handling.
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.
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:68
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).
QgsTableView(QWidget *parent=nullptr)
Constructor for QgsTableView.
Represents a vector layer which manages a vector based dataset.
void readOnlyChanged()
Emitted when the read only state of this layer is changed.
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:8379
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:8378
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.