48  for ( 
const auto fid : layer->selectedFeatureIds() )
 
   49    if ( mRequest.acceptFeature( layer->getFeature( fid ) ) )
 
   50      mSelectedFeatureIds << fid;
 
   55const QgsFeatureIds &QgsFilteredSelectionManager::selectedFeatureIds()
 const 
   59  return mSelectedFeatureIds;
 
   62int QgsFilteredSelectionManager::selectedFeatureCount()
 
   64  return mSelectedFeatureIds.count();
 
   67void QgsFilteredSelectionManager::onSelectionChanged( 
const QgsFeatureIds &selected, 
const QgsFeatureIds &deselected, 
bool clearAndSelect )
 
   72    mSelectedFeatureIds.clear();
 
   76    for ( 
const auto fid : deselected )
 
   77      mSelectedFeatureIds.remove( fid );
 
   80  for ( 
const auto fid : selected )
 
   81    if ( mRequest.acceptFeature( layer()->getFeature( fid ) ) )
 
   82      mSelectedFeatureIds << fid;
 
   84      lselected.remove( fid );
 
   86  emit selectionChanged( lselected, deselected, clearAndSelect );
 
   94  , mShowFirstFeature( config.value( QStringLiteral( 
"show_first_feature" ), true ).toBool() )
 
   95  , mAllowAddChildFeatureWithNoGeometry( config.value( QStringLiteral( 
"allow_add_child_feature_with_no_geometry" ), false ).toBool() )
 
   97  QVBoxLayout *rootLayout = 
new QVBoxLayout( 
this );
 
   98  rootLayout->setContentsMargins( 0, 9, 0, 0 );
 
  101  QHBoxLayout *buttonLayout = 
new QHBoxLayout();
 
  102  buttonLayout->setContentsMargins( 0, 0, 0, 0 );
 
  104  mToggleEditingButton = 
new QToolButton( 
this );
 
  105  mToggleEditingButton->setObjectName( QStringLiteral( 
"mToggleEditingButton" ) );
 
  107  mToggleEditingButton->setText( tr( 
"Toggle Editing" ) );
 
  108  mToggleEditingButton->setEnabled( 
false );
 
  109  mToggleEditingButton->setCheckable( 
true );
 
  110  mToggleEditingButton->setToolTip( tr( 
"Toggle editing mode for child layer" ) );
 
  111  buttonLayout->addWidget( mToggleEditingButton );
 
  113  mSaveEditsButton = 
new QToolButton( 
this );
 
  115  mSaveEditsButton->setText( tr( 
"Save Child Layer Edits" ) );
 
  116  mSaveEditsButton->setToolTip( tr( 
"Save child layer edits" ) );
 
  117  mSaveEditsButton->setEnabled( 
true );
 
  118  buttonLayout->addWidget( mSaveEditsButton );
 
  120  mAddFeatureGeometryButton = 
new QToolButton( 
this );
 
  121  mAddFeatureGeometryButton->setObjectName( QStringLiteral( 
"mAddFeatureGeometryButton" ) );
 
  122  buttonLayout->addWidget( mAddFeatureGeometryButton );
 
  124  mAddFeatureButton = 
new QToolButton( 
this );
 
  126  mAddFeatureButton->setText( tr( 
"Add Child Feature" ) );
 
  127  mAddFeatureButton->setToolTip( tr( 
"Add child feature" ) );
 
  128  mAddFeatureButton->setObjectName( QStringLiteral( 
"mAddFeatureButton" ) );
 
  129  buttonLayout->addWidget( mAddFeatureButton );
 
  131  mDuplicateFeatureButton = 
new QToolButton( 
this );
 
  133  mDuplicateFeatureButton->setText( tr( 
"Duplicate Child Feature(s)" ) );
 
  134  mDuplicateFeatureButton->setToolTip( tr( 
"Duplicate selected child feature(s)" ) );
 
  135  mDuplicateFeatureButton->setObjectName( QStringLiteral( 
"mDuplicateFeatureButton" ) );
 
  136  buttonLayout->addWidget( mDuplicateFeatureButton );
 
  138  mDeleteFeatureButton = 
new QToolButton( 
this );
 
  140  mDeleteFeatureButton->setText( tr( 
"Delete Child Feature(s)" ) );
 
  141  mDeleteFeatureButton->setToolTip( tr( 
"Delete selected child feature(s)" ) );
 
  142  mDeleteFeatureButton->setObjectName( QStringLiteral( 
"mDeleteFeatureButton" ) );
 
  143  buttonLayout->addWidget( mDeleteFeatureButton );
 
  145  mLinkFeatureButton = 
new QToolButton( 
this );
 
  147  mLinkFeatureButton->setText( tr( 
"Link Existing Feature(s)" ) );
 
  148  mLinkFeatureButton->setToolTip( tr( 
"Link existing child feature(s)" ) );
 
  149  mLinkFeatureButton->setObjectName( QStringLiteral( 
"mLinkFeatureButton" ) );
 
  150  buttonLayout->addWidget( mLinkFeatureButton );
 
  152  mUnlinkFeatureButton = 
new QToolButton( 
this );
 
  154  mUnlinkFeatureButton->setText( tr( 
"Unlink Feature(s)" ) );
 
  155  mUnlinkFeatureButton->setToolTip( tr( 
"Unlink selected child feature(s)" ) );
 
  156  mUnlinkFeatureButton->setObjectName( QStringLiteral( 
"mUnlinkFeatureButton" ) );
 
  157  buttonLayout->addWidget( mUnlinkFeatureButton );
 
  159  mZoomToFeatureButton = 
new QToolButton( 
this );
 
  161  mZoomToFeatureButton->setText( tr( 
"Zoom To Feature(s)" ) );
 
  162  mZoomToFeatureButton->setToolTip( tr( 
"Zoom to selected child feature(s)" ) );
 
  163  mZoomToFeatureButton->setObjectName( QStringLiteral( 
"mZoomToFeatureButton" ) );
 
  164  buttonLayout->addWidget( mZoomToFeatureButton );
 
  166  buttonLayout->addItem( 
new QSpacerItem( 0, 0, QSizePolicy::Expanding ) );
 
  168  mFormViewButton = 
new QToolButton( 
this );
 
  169  mFormViewButton->setText( tr( 
"Form View" ) );
 
  170  mFormViewButton->setToolTip( tr( 
"Switch to form view" ) );
 
  172  mFormViewButton->setCheckable( 
true );
 
  174  buttonLayout->addWidget( mFormViewButton );
 
  176  mTableViewButton = 
new QToolButton( 
this );
 
  177  mTableViewButton->setText( tr( 
"Table View" ) );
 
  178  mTableViewButton->setToolTip( tr( 
"Switch to table view" ) );
 
  180  mTableViewButton->setCheckable( 
true );
 
  182  buttonLayout->addWidget( mTableViewButton );
 
  184  mViewModeButtonGroup = 
new QButtonGroup( 
this );
 
  188  mMultiEditInfoLabel = 
new QLabel( 
this );
 
  189  buttonLayout->addWidget( mMultiEditInfoLabel );
 
  192  rootLayout->addLayout( buttonLayout );
 
  195  mStackedWidget = 
new QStackedWidget( 
this );
 
  199  mDualView->
setView( mViewMode );
 
  203  mMultiEditStackedWidgetPage = 
new QWidget( 
this );
 
  205    QVBoxLayout *vBoxLayout = 
new QVBoxLayout();
 
  206    vBoxLayout->setContentsMargins( 0, 0, 0, 0 );
 
  208    mMultiEditTreeWidget = 
new QTreeWidget( 
this );
 
  209    mMultiEditTreeWidget->setHeaderHidden( 
true );
 
  210    mMultiEditTreeWidget->setSelectionMode( QTreeWidget::ExtendedSelection );
 
  211    vBoxLayout->addWidget( mMultiEditTreeWidget );
 
  213    mMultiEditStackedWidgetPage->setLayout( vBoxLayout );
 
  215  mStackedWidget->addWidget( mMultiEditStackedWidgetPage );
 
  217  mStackedWidget->addWidget( mDualView );
 
  219  rootLayout->addWidget( mStackedWidget );
 
  221  connect( mViewModeButtonGroup, &QButtonGroup::idClicked,
 
  223  connect( mToggleEditingButton, &QAbstractButton::clicked, 
this, &QgsRelationEditorWidget::toggleEditing );
 
  225  connect( mAddFeatureButton, &QAbstractButton::clicked, 
this, &QgsRelationEditorWidget::addFeature );
 
  226  connect( mAddFeatureGeometryButton, &QAbstractButton::clicked, 
this, &QgsRelationEditorWidget::addFeatureGeometry );
 
  232  connect( mMultiEditTreeWidget, &QTreeWidget::itemSelectionChanged, 
this, &QgsRelationEditorWidget::multiEditItemSelectionChanged );
 
  237  setLayout( rootLayout );
 
 
  251  mFeatureSelectionMgr = 
new QgsFilteredSelectionManager( layer, request, mDualView );
 
  261    text = tr( 
"Add Point Child Feature" );
 
  266    text = tr( 
"Add Line Child Feature" );
 
  271    text = tr( 
"Add Polygon Child Feature" );
 
  274  mAddFeatureGeometryButton->setIcon( icon );
 
  275  mAddFeatureGeometryButton->setText( text );
 
  276  mAddFeatureGeometryButton->setToolTip( text );
 
  288    mMapToolDigitize->
setButton( mAddFeatureGeometryButton );
 
 
  300void QgsRelationEditorWidget::updateButtons()
 
  302  bool toggleEditingButtonEnabled = 
false;
 
  304  bool canAddGeometry = 
false;
 
  305  bool canRemove = 
false;
 
  306  bool canEdit = 
false;
 
  307  bool canLink = 
false;
 
  308  bool canUnlink = 
false;
 
  309  bool spatial = 
false;
 
  333  const bool selectionNotEmpty = mFeatureSelectionMgr ? mFeatureSelectionMgr->
selectedFeatureCount() : 
false;
 
  336    const bool multieditLinkedChildSelected = ! selectedChildFeatureIds().isEmpty();
 
  338    canAddGeometry = 
false;
 
  340    canRemove = canRemove && multieditLinkedChildSelected;
 
  344    canUnlink = canUnlink && multieditLinkedChildSelected;
 
  348    canRemove = canRemove && selectionNotEmpty;
 
  349    canUnlink = canUnlink && selectionNotEmpty;
 
  352  mToggleEditingButton->setEnabled( toggleEditingButtonEnabled );
 
  353  mAddFeatureButton->setEnabled( canAdd );
 
  354  mAddFeatureGeometryButton->setEnabled( canAddGeometry );
 
  355  mDuplicateFeatureButton->setEnabled( canEdit && selectionNotEmpty );
 
  356  mLinkFeatureButton->setEnabled( canLink );
 
  357  mDeleteFeatureButton->setEnabled( canRemove );
 
  358  mUnlinkFeatureButton->setEnabled( canUnlink );
 
  359  mZoomToFeatureButton->setEnabled( selectionNotEmpty );
 
  360  mToggleEditingButton->setChecked( canEdit );
 
  361  mSaveEditsButton->setEnabled( canEdit || canLink || canUnlink );
 
  375void QgsRelationEditorWidget::addFeature()
 
  382  mMultiEditTreeWidget->blockSignals( 
true );
 
  383  mMultiEdit1NJustAddedIds = addedFeatures;
 
  384  QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
 
  385  while ( *treeWidgetItemIterator )
 
  387    if ( ( *treeWidgetItemIterator )->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() != 
static_cast<int>( MultiEditFeatureType::Child ) )
 
  389      ++treeWidgetItemIterator;
 
  393    if ( addedFeatures.contains( ( *treeWidgetItemIterator )->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt() ) )
 
  394      ( *treeWidgetItemIterator )->setSelected( 
true );
 
  396    ++treeWidgetItemIterator;
 
  398  mMultiEditTreeWidget->blockSignals( 
false );
 
  404void QgsRelationEditorWidget::addFeatureGeometry()
 
  408    QgsLogger::warning( tr( 
"Adding a geometry feature is not supported in multiple edit mode" ) );
 
  418  mMapToolDigitize->
setLayer( layer );
 
  421  if ( window()->objectName() != QLatin1String( 
"QgisApp" ) )
 
  423    window()->setVisible( 
false );
 
  425  setMapTool( mMapToolDigitize );
 
  436    const QString msg = tr( 
"Digitize the geometry for the new feature on layer %1. Press <ESC> to cancel." )
 
  437                        .arg( layer->
name() );
 
  439    lMainMessageBar->pushItem( mMessageBarItem );
 
  443void QgsRelationEditorWidget::onDigitizingCompleted( 
const QgsFeature &feature )
 
  446  digitizingFinished();
 
  449void QgsRelationEditorWidget::multiEditItemSelectionChanged()
 
  451  const QList<QTreeWidgetItem *> selectedItems = mMultiEditTreeWidget->selectedItems();
 
  455  if ( selectedItems.size() == 1
 
  456       && mMultiEditPreviousSelectedItems.size() <= 1 )
 
  458    if ( selectedItems.first()->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() == 
static_cast<int>( MultiEditFeatureType::Child ) )
 
  460      mMultiEditTreeWidget->blockSignals( 
true );
 
  462      const QgsFeatureId featureIdSelectedItem = selectedItems.first()->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
 
  464      QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
 
  465      while ( *treeWidgetItemIterator )
 
  467        if ( ( *treeWidgetItemIterator )->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() != 
static_cast<int>( MultiEditFeatureType::Child ) )
 
  469          ++treeWidgetItemIterator;
 
  473        const QgsFeatureId featureIdCurrentItem = ( *treeWidgetItemIterator )->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
 
  476          if ( featureIdSelectedItem == featureIdCurrentItem )
 
  477            ( *treeWidgetItemIterator )->setSelected( 
true );
 
  481          if ( ! mMultiEdit1NJustAddedIds.contains( featureIdSelectedItem ) )
 
  484          if ( mMultiEdit1NJustAddedIds.contains( featureIdCurrentItem ) )
 
  485            ( *treeWidgetItemIterator )->setSelected( 
true );
 
  488        ++treeWidgetItemIterator;
 
  490      mMultiEditTreeWidget->blockSignals( 
false );
 
  493  mMultiEditPreviousSelectedItems = selectedItems;
 
  497void QgsRelationEditorWidget::toggleEditing( 
bool state )
 
  515    updateUiSingleEdit();
 
 
  520  mButtonsVisibility = buttons;
 
 
  527  if ( mLinkFeatureButton->isVisible() )
 
  529  if ( mUnlinkFeatureButton->isVisible() )
 
  531  if ( mSaveEditsButton->isVisible() )
 
  533  if ( mAddFeatureButton->isVisible() )
 
  535  if ( mDuplicateFeatureButton->isVisible() )
 
  537  if ( mDeleteFeatureButton->isVisible() )
 
  539  if ( mZoomToFeatureButton->isVisible() )
 
 
  553    QAction *qAction = 
nullptr;
 
  558      connect( qAction, &QAction::triggered, 
this, [
this, fid]() { 
deleteFeature( fid ); } );
 
  564      connect( qAction, &QAction::triggered, 
this, [
this, fid]() { 
unlinkFeature( fid ); } );
 
  569void QgsRelationEditorWidget::setMapTool( 
QgsMapTool *mapTool )
 
  574  mapCanvas->window()->raise();
 
  575  mapCanvas->activateWindow();
 
  576  mapCanvas->setFocus();
 
  580void QgsRelationEditorWidget::unsetMapTool()
 
  590QgsFeatureIds QgsRelationEditorWidget::selectedChildFeatureIds()
 const 
  595    for ( QTreeWidgetItem *treeWidgetItem : mMultiEditTreeWidget->selectedItems() )
 
  597      if ( 
static_cast<MultiEditFeatureType
>( treeWidgetItem->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() ) != MultiEditFeatureType::Child )
 
  600      featureIds.insert( treeWidgetItem->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toLongLong() );
 
  608void QgsRelationEditorWidget::updateUiSingleEdit()
 
  610  mFormViewButton->setVisible( 
true );
 
  611  mTableViewButton->setVisible( 
true );
 
  612  mMultiEditInfoLabel->setVisible( 
false );
 
  614  mStackedWidget->setCurrentWidget( mDualView );
 
  627      filters << filter.prepend( 
'(' ).append( 
')' );
 
  647    initDualView( layer, request );
 
  651    mFeatureSelectionMgr = 
new QgsFilteredSelectionManager( layer, request, mDualView );
 
  662void QgsRelationEditorWidget::updateUiMultiEdit()
 
  664  mFormViewButton->setVisible( 
false );
 
  665  mTableViewButton->setVisible( 
false );
 
  666  mMultiEditInfoLabel->setVisible( 
true );
 
  668  mStackedWidget->setCurrentWidget( mMultiEditStackedWidgetPage ) ;
 
  670  QList<QTreeWidgetItem *> parentTreeWidgetItems;
 
  673  QMultiMap<QTreeWidgetItem *, QgsFeatureId> multimapChildFeatures;
 
  675  mMultiEditTreeWidget->clear();
 
  678    QTreeWidgetItem *treeWidgetItem = createMultiEditTreeWidgetItem( featureParent, 
mRelation.
referencedLayer(), MultiEditFeatureType::Parent );
 
  681    treeWidgetItem->setFlags( Qt::ItemIsEnabled );
 
  683    parentTreeWidgetItems.append( treeWidgetItem );
 
  689    while ( featureIterator.
nextFeature( featureChild ) )
 
  696        while ( featureIteratorFinalChild.
nextFeature( featureChildChild ) )
 
  698          QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChildChild, 
mNmRelation.
referencedLayer(), MultiEditFeatureType::Child );
 
  700          treeWidgetItem->addChild( treeWidgetItemChild );
 
  702          featureIdsMixedValues.insert( featureChildChild.
id() );
 
  703          multimapChildFeatures.insert( treeWidgetItem, featureChildChild.
id() );
 
  708        QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChild, 
mRelation.
referencingLayer(), MultiEditFeatureType::Child );
 
  709        treeWidgetItem->addChild( treeWidgetItemChild );
 
  711        featureIdsMixedValues.insert( featureChild.
id() );
 
  715    mMultiEditTreeWidget->addTopLevelItem( treeWidgetItem );
 
  716    treeWidgetItem->setExpanded( 
true );
 
  732    QgsFeatureIds::iterator iterator = featureIdsMixedValues.begin();
 
  733    while ( iterator != featureIdsMixedValues.end() )
 
  735      bool mixedValues = 
false;
 
  736      for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
 
  738        if ( ! multimapChildFeatures.values( parentTreeWidgetItem ).contains( *iterator ) )
 
  747        iterator = featureIdsMixedValues.erase( iterator );
 
  756  if ( featureIdsMixedValues.isEmpty() )
 
  759    mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(),
 
  760                                    mMultiEditInfoLabel->height() ) );
 
  761    mMultiEditInfoLabel->setToolTip( tr( 
"All features in selection have equal relations" ) );
 
  766    mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(),
 
  767                                    mMultiEditInfoLabel->height() ) );
 
  768    mMultiEditInfoLabel->setToolTip( tr( 
"Some features in selection have different relations" ) );
 
  771    QFont fontItalic = mMultiEditTreeWidget->font();
 
  772    fontItalic.setItalic( 
true );
 
  773    for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
 
  775      for ( 
int childIndex = 0; childIndex < parentTreeWidgetItem->childCount(); ++childIndex )
 
  777        QTreeWidgetItem *childItem = parentTreeWidgetItem->child( childIndex );
 
  778        const QgsFeatureId featureIdCurrentItem = childItem->data( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
 
  779        if ( featureIdsMixedValues.contains( featureIdCurrentItem ) )
 
  780          childItem->setFont( 0, fontItalic );
 
  786QTreeWidgetItem *QgsRelationEditorWidget::createMultiEditTreeWidgetItem( 
const QgsFeature &feature, 
QgsVectorLayer *layer, MultiEditFeatureType type )
 
  788  QTreeWidgetItem *treeWidgetItem = 
new QTreeWidgetItem();
 
  791  treeWidgetItem->setData( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ), 
static_cast<int>( type ) );
 
  792  treeWidgetItem->setData( 0, 
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ), 
feature.
id() );
 
  793  return treeWidgetItem;
 
  796void QgsRelationEditorWidget::onDigitizingCanceled( )
 
  798  digitizingFinished();
 
  801void QgsRelationEditorWidget::digitizingFinished( )
 
  803  window()->setVisible( 
true );
 
  805  window()->activateWindow();
 
  809void QgsRelationEditorWidget::mapToolDeactivated()
 
  815  mMessageBarItem = 
nullptr;
 
  821    {
"show_first_feature", mShowFirstFeature},
 
  822    {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry }
 
 
  829  mShowFirstFeature = 
config.value( QStringLiteral( 
"show_first_feature" ), 
true ).toBool();
 
  830  mAllowAddChildFeatureWithNoGeometry = 
config.value( QStringLiteral( 
"allow_add_child_feature_with_no_geometry" ), 
false ).toBool();
 
 
  836  Q_UNUSED( newRelation );
 
  837  Q_UNUSED( newFeature );
 
 
  866  Q_UNUSED( newRelation );
 
  867  Q_UNUSED( newNmRelation );
 
 
  901  return mFeatureSelectionMgr;
 
 
  906  const QgsFeatureIds selectedFids = selectedChildFeatureIds();
 
 
  922  const QgsFeatureIds selectedFids = selectedChildFeatureIds();
 
 
  961    {
"show_first_feature", mShowFirstFeature->isChecked()},
 
  962    {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry->isChecked()}
 
 
  977  mShowFirstFeature->setChecked( 
config.value( QStringLiteral( 
"show_first_feature" ), 
true ).toBool() );
 
  978  mAllowAddChildFeatureWithNoGeometry->setChecked( 
config.value( QStringLiteral( 
"allow_add_child_feature_with_no_geometry" ), 
false ).toBool() );
 
 
  993  return QStringLiteral( 
"relation_editor" );
 
 
  998  return QObject::tr( 
"Relation Editor" );
 
 
void reset(T *p=nullptr)
Will reset the managed pointer to p.
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
This class contains context information for attribute editor widgets.
 
QgsMapCanvas * mapCanvas() const
Returns the associated map canvas (e.g.
 
QgsAdvancedDigitizingDockWidget * cadDockWidget() const
Returns the associated CAD dock widget (e.g.
 
void setParentFormFeature(const QgsFeature &feature)
Sets the feature of the currently edited parent form.
 
QgsMessageBar * mainMessageBar()
Returns the main message bar.
 
QgsVectorLayer * layer() const
Returns the layer this model uses as backend.
 
virtual void loadLayer()
Loads the layer into the model Preferably to be called, before using this model as source for any oth...
 
This widget is used to show the attributes of a set of features of a QgsVectorLayer.
 
void showContextMenuExternally(QgsActionMenu *menu, QgsFeatureId fid)
Emitted when selecting context menu on the feature list to create the context menu individually.
 
ViewMode
The view modes, in which this widget can present information.
 
@ AttributeTable
Shows the features and attributes in a table layout.
 
@ AttributeEditor
Show a list of the features, where one can be chosen and the according attribute dialog will be prese...
 
void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
Set the feature selection model.
 
void init(QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request=QgsFeatureRequest(), const QgsAttributeEditorContext &context=QgsAttributeEditorContext(), bool loadFeatures=true, bool showFirstFeature=true)
Has to be called to initialize the dual view.
 
void setRequest(const QgsFeatureRequest &request)
Set the request.
 
void parentFormValueChanged(const QString &attribute, const QVariant &value)
Called in embedded forms when an attribute value in the parent form has changed.
 
QgsAttributeTableModel * masterModel() const
Returns the model which has the information about all features (not only filtered)
 
void setView(ViewMode view)
Change the current view mode.
 
QString expression() const
Returns the original, unmodified expression string.
 
Wrapper for iterator of features from vector data provider or vector layer.
 
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
 
This class wraps a request for features to a vector layer (or directly its vector data provider).
 
QgsExpression * filterExpression() const
Returns the filter expression (if set).
 
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
Is an interface class to abstract feature selection handling.
 
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
 
static QIcon iconForLayer(const QgsMapLayer *layer)
Returns the icon corresponding to a specified map layer.
 
static void warning(const QString &msg)
Goes to qWarning.
 
Map canvas is a class for displaying all GIS data types on a canvas.
 
void unsetMapTool(QgsMapTool *mapTool)
Unset the current map tool or last non zoom tool.
 
void setMapTool(QgsMapTool *mapTool, bool clean=false)
Sets the map tool currently being used on the canvas.
 
void zoomToFeatureIds(QgsVectorLayer *layer, const QgsFeatureIds &ids)
Set canvas extent to the bounding box of a set of features.
 
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
 
void editingStarted()
Emitted when editing on this layer has started.
 
bool popWidget(QgsMessageBarItem *item)
Remove the specified item from the bar, and display the next most recent one in the stack.
 
static QgsMessageBarItem * createMessage(const QString &text, QWidget *parent=nullptr)
Creates message bar item widget containing a message text to be displayed on the bar.
 
QgsFeatureRequest getReferencedFeatureRequest(const QgsAttributes &attributes) const
Creates a request to return the feature on the referenced (parent) layer which is referenced by the p...
 
QgsVectorLayer * referencedLayer
 
QgsVectorLayer * referencingLayer
 
QgsFeatureRequest getRelatedFeaturesRequest(const QgsFeature &feature) const
Creates a request to return all the features on the referencing (child) layer which have a foreign ke...
 
int selectedFeatureCount() override
Returns the number of features that are selected in this layer.
 
const QgsFeatureIds & selectedFeatureIds() const override
Returns reference to identifiers of selected features.
 
static QString getFeatureDisplayString(const QgsVectorLayer *layer, const QgsFeature &feature)
 
Represents a vector layer which manages a vector based data sets.
 
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
bool isEditable() const FINAL
Returns true if the provider is in editing mode.
 
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
 
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
QString qgsFlagValueToKeys(const T &value, bool *returnOk=nullptr)
Returns the value for the given keys of a flag.
 
T qgsFlagKeysToValue(const QString &keys, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given keys of a flag.
 
QSet< QgsFeatureId > QgsFeatureIds
 
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features