QGIS API Documentation  3.22.4-Białowieża (ce8e65e95e)
qgsattributeform.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsattributeform.h
3  --------------------------------------
4  Date : 3.5.2014
5  Copyright : (C) 2014 Matthias Kuhn
6  Email : matthias at opengis dot ch
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 #ifndef QGSATTRIBUTEFORM_H
17 #define QGSATTRIBUTEFORM_H
18 
19 #include "qgsfeature.h"
20 #include "qgis_sip.h"
22 #include "qgseditorwidgetwrapper.h"
23 
24 #include <QWidget>
25 #include <QLabel>
26 #include <QDialogButtonBox>
27 #include "qgis_gui.h"
28 
29 
32 class QgsMessageBar;
33 class QgsMessageBarItem;
34 class QgsWidgetWrapper;
35 class QgsTabWidget;
38 class QSvgWidget;
39 
44 class GUI_EXPORT QgsAttributeForm : public QWidget
45 {
46  Q_OBJECT
47 
48  public:
49 
51  enum Mode
52  {
54  AddFeatureMode,
59  IdentifyMode
60  };
61 
64  {
68  };
69 
70  explicit QgsAttributeForm( QgsVectorLayer *vl,
71  const QgsFeature &feature = QgsFeature(),
73  QWidget *parent SIP_TRANSFERTHIS = nullptr );
74  ~QgsAttributeForm() override;
75 
76  const QgsFeature &feature() { return mFeature; }
77 
84  QgsFeature currentFormFeature() const { return mCurrentFormFeature; }
85 
92  void displayWarning( const QString &message );
93 
94  // TODO QGIS 4.0 - make private
95 
100  void hideButtonBox();
101 
102  // TODO QGIS 4.0 - make private
103 
108  void showButtonBox();
109 
110  // TODO QGIS 4.0 - make private
111 
116  void disconnectButtonBox();
117 
122  void addInterface( QgsAttributeFormInterface *iface SIP_TRANSFER );
123 
129  QgsVectorLayer *layer() { return mLayer; }
130 
136  bool editable();
137 
143  QgsAttributeEditorContext::Mode mode() const { return mMode; }
144 
151  void setMode( QgsAttributeEditorContext::Mode mode );
152 
158  void setEditCommandMessage( const QString &message ) { mEditCommandMessage = message; }
159 
168  bool eventFilter( QObject *object, QEvent *event ) override;
169 
175  void setMultiEditFeatureIds( const QgsFeatureIds &fids );
176 
183  void setMessageBar( QgsMessageBar *messageBar );
184 
192  QString aggregateFilter() const;
193 
200  void setExtraContextScope( QgsExpressionContextScope *extraScope SIP_TRANSFER );
201 
202  signals:
203 
212  Q_DECL_DEPRECATED void attributeChanged( const QString &attribute, const QVariant &value ) SIP_DEPRECATED;
213 
222  void widgetValueChanged( const QString &attribute, const QVariant &value, bool attributeChanged );
223 
232  void beforeSave( bool &ok ) SIP_SKIP;
233 
237  void featureSaved( const QgsFeature &feature );
238 
245  void filterExpressionSet( const QString &expression, QgsAttributeForm::FilterType type );
246 
252 
257  void closed();
258 
263  void zoomToFeatures( const QString &filter );
264 
269  void flashFeatures( const QString &filter );
270 
271  public slots:
272 
280  void changeAttribute( const QString &field, const QVariant &value, const QString &hintText = QString() );
281 
287  void setFeature( const QgsFeature &feature );
288 
294  bool save();
295 
305  bool saveWithDetails( QString *error SIP_OUT = nullptr );
306 
310  void resetValues();
311 
316  void resetSearch();
317 
321  void refreshFeature();
322 
332  void parentFormValueChanged( const QString &attribute, const QVariant &newValue );
333 
338  bool needsGeometry() const;
339 
340  private slots:
341  void onAttributeChanged( const QVariant &value, const QVariantList &additionalFieldValues );
342  void onAttributeAdded( int idx );
343  void onAttributeDeleted( int idx );
344  void onRelatedFeaturesChanged();
345  void onUpdatedFields();
346  void onConstraintStatusChanged( const QString &constraint,
347  const QString &description, const QString &err, QgsEditorWidgetWrapper::ConstraintResult result );
348  void preventFeatureRefresh();
349  void synchronizeState();
350  void layerSelectionChanged();
351 
353  bool saveMultiEdits();
354  void resetMultiEdit( bool promptToSave = false );
355  void multiEditMessageClicked( const QString &link );
356 
357  void filterAndTriggered();
358  void filterOrTriggered();
359  void filterTriggered();
360 
361  void searchZoomTo();
362  void searchFlash();
363  void searchSetSelection();
364  void searchAddToSelection();
365  void searchRemoveFromSelection();
366  void searchIntersectSelection();
367 
368  private:
369  void init();
370 
371  void cleanPython();
372 
373  void initPython();
374 
375  void updateJoinedFields( const QgsEditorWidgetWrapper &eww );
376 
377  bool fieldIsEditable( int fieldIndex ) const;
378 
379  bool fieldIsEditable( const QgsVectorLayer &layer, int fieldIndex, QgsFeatureId fid ) const;
380 
381  void updateFieldDependencies();
382  void updateFieldDependenciesDefaultValue( QgsEditorWidgetWrapper *eww );
383  void updateFieldDependenciesVirtualFields( QgsEditorWidgetWrapper *eww );
384  void updateRelatedLayerFieldsDependencies( QgsEditorWidgetWrapper *eww = nullptr );
385 
386  struct WidgetInfo
387  {
388  QWidget *widget = nullptr;
389  QString labelText;
390  QString toolTip;
391  QString hint;
392  bool labelOnTop = false;
393  bool labelAlignRight = false;
394  bool showLabel = true;
395  };
396 
397  WidgetInfo createWidgetFromDef( const QgsAttributeEditorElement *widgetDef, QWidget *parent, QgsVectorLayer *vl, QgsAttributeEditorContext &context );
398 
399  void addWidgetWrapper( QgsEditorWidgetWrapper *eww );
400 
405  void createWrappers();
406  void afterWidgetInit();
407 
408  void scanForEqualAttributes( QgsFeatureIterator &fit, QSet< int > &mixedValueFields, QHash< int, QVariant > &fieldSharedValues ) const;
409 
411  bool saveEdits( QString *error );
412 
413  QgsFeature getUpdatedFeature() const;
414 
416  void updateValuesDependencies( const int originIdx );
417  void updateValuesDependenciesDefaultValues( const int originIdx );
418  void updateValuesDependenciesVirtualFields( const int originIdx );
419  void updateRelatedLayerFields();
420 
421  void clearMultiEditMessages();
422  void pushSelectedFeaturesMessage();
423  void runSearchSelect( Qgis::SelectBehavior behavior );
424 
425  QString createFilterExpression() const;
426 
427  QgsExpressionContext createExpressionContext( const QgsFeature &feature ) const;
428 
430  void updateAllConstraints();
431  void updateConstraints( QgsEditorWidgetWrapper *w );
432  void updateContainersVisibility();
433  void updateConstraint( const QgsFeature &ft, QgsEditorWidgetWrapper *eww );
434  void updateLabels();
435  bool currentFormValuesFeature( QgsFeature &feature );
436  bool currentFormValidConstraints( QStringList &invalidFields, QStringList &descriptions ) const;
437  bool currentFormValidHardConstraints( QStringList &invalidFields, QStringList &descriptions ) const;
438  QList<QgsEditorWidgetWrapper *> constraintDependencies( QgsEditorWidgetWrapper *w );
439 
440  Q_DECL_DEPRECATED QgsRelationWidgetWrapper *setupRelationWidgetWrapper( const QgsRelation &rel, const QgsAttributeEditorContext &context ) SIP_DEPRECATED;
441  QgsRelationWidgetWrapper *setupRelationWidgetWrapper( const QString &relationWidgetTypeId, const QgsRelation &rel, const QgsAttributeEditorContext &context );
442 
443  QgsVectorLayer *mLayer = nullptr;
444  QgsFeature mFeature;
445  QgsFeature mCurrentFormFeature;
446  QgsMessageBar *mMessageBar = nullptr;
447  bool mOwnsMessageBar;
448  QgsMessageBarItem *mMultiEditUnsavedMessageBarItem = nullptr;
449  QgsMessageBarItem *mMultiEditMessageBarItem = nullptr;
450  QList<QgsWidgetWrapper *> mWidgets;
451  QgsAttributeEditorContext mContext;
452  std::unique_ptr<QgsExpressionContextScope> mExtraContextScope;
453  QDialogButtonBox *mButtonBox = nullptr;
454  QWidget *mSearchButtonBox = nullptr;
455  QList<QgsAttributeFormInterface *> mInterfaces;
456  QMap< int, QgsAttributeFormEditorWidget * > mFormEditorWidgets;
457  QList< QgsAttributeFormWidget *> mFormWidgets;
458  QMap<const QgsVectorLayerJoinInfo *, QgsFeature> mJoinedFeatures;
459  QMap<QLabel *, QgsProperty> mLabelDataDefinedProperties;
460  bool mValuesInitialized = false;
461  bool mDirty = false;
462  bool mIsSettingFeature = false;
463 
464  bool mValidConstraints = true;
465  QgsMessageBarItem *mConstraintsFailMessageBarItem = nullptr;
466 
467  struct ContainerInformation
468  {
469  ContainerInformation( QgsTabWidget *tabWidget, QWidget *widget, const QgsExpression &expression )
470  : tabWidget( tabWidget )
471  , widget( widget )
472  , expression( expression )
473  , isVisible( true )
474  {}
475 
476  ContainerInformation( QWidget *widget, const QgsExpression &expression )
477  : widget( widget )
478  , expression( expression )
479  , isVisible( true )
480  {}
481 
482  QgsTabWidget *tabWidget = nullptr;
483  QWidget *widget = nullptr;
484  QgsExpression expression;
485  bool isVisible;
486 
487  void apply( QgsExpressionContext *expressionContext );
488  };
489 
490  void registerContainerInformation( ContainerInformation *info );
491 
492  void updateIcon( QgsEditorWidgetWrapper *eww );
493 
494  void reloadIcon( const QString &file, const QString &tooltip, QSvgWidget *sw );
495 
496  // Contains information about tabs and groupboxes, their visibility state visibility conditions
497  QVector<ContainerInformation *> mContainerVisibilityInformation;
498  QMap<QString, QVector<ContainerInformation *> > mContainerInformationDependency;
499 
500  // Variables below are used for Python
501  static int sFormCounter;
502  int mFormNr;
503  QString mPyFormVarName;
504 
506  bool mIsSaving;
507 
509  bool mPreventFeatureRefresh;
510 
511  bool mIsSettingMultiEditFeatures;
512 
513  QgsFeatureIds mMultiEditFeatureIds;
514  bool mUnsavedMultiEditChanges;
515 
516  QString mEditCommandMessage;
517 
519 
520  QMap<QWidget *, QSvgWidget *> mIconMap;
521 
526  QMap<int, QgsWidgetWrapper *> mDefaultValueDependencies;
527 
532  QMap<int, QgsWidgetWrapper *> mVirtualFieldsDependencies;
533 
537  QSet<QgsEditorWidgetWrapper *> mRelatedLayerFieldsDependencies;
538 
540  QList<int> mAlreadyUpdatedFields;
541 
542  bool mNeedsGeometry = false;
543 
544  friend class TestQgsDualView;
545  friend class TestQgsAttributeForm;
546 };
547 
548 #endif // QGSATTRIBUTEFORM_H
SelectBehavior
Specifies how a selection should be applied.
Definition: qgis.h:545
This class contains context information for attribute editor widgets.
This is an abstract base class for any elements of a drag and drop form.
A widget consisting of both an editor widget and additional widgets for controlling the behavior of t...
Base class for all widgets shown on a QgsAttributeForm.
void beforeSave(bool &ok)
Will be emitted before the feature is saved.
QgsVectorLayer * layer()
Returns the layer for which this form is shown.
@ SearchMode
Form values are used for searching/filtering the layer.
@ MultiEditMode
Multi edit mode, for editing fields of multiple features at once.
@ AggregateSearchMode
Form is in aggregate search mode, show each widget in this mode.
@ SingleEditMode
Single edit mode, for editing a single feature.
void filterExpressionSet(const QString &expression, QgsAttributeForm::FilterType type)
Emitted when a filter expression is set using the form.
const QgsFeature & feature()
void closed()
Emitted when the user selects the close option from the form's button bar.
void setEditCommandMessage(const QString &message)
Sets the edit command message (Undo) that will be used when the dialog is accepted.
void widgetValueChanged(const QString &attribute, const QVariant &value, bool attributeChanged)
Notifies about changes of attributes.
void flashFeatures(const QString &filter)
Emitted when the user chooses to flash a filtered set of features.
void modeChanged(QgsAttributeEditorContext::Mode mode)
Emitted when the form changes mode.
void featureSaved(const QgsFeature &feature)
Emitted when a feature is changed or added.
void zoomToFeatures(const QString &filter)
Emitted when the user chooses to zoom to a filtered set of features.
QgsFeature currentFormFeature() const
Returns the feature that is currently displayed in the form with all the changes received on editing ...
Q_DECL_DEPRECATED void attributeChanged(const QString &attribute, const QVariant &value)
Notifies about changes of attributes, this signal is not emitted when the value is set back to the or...
FilterType
Filter types.
@ ReplaceFilter
Filter should replace any existing filter.
@ FilterOr
Filter should be combined using "OR".
@ FilterAnd
Filter should be combined using "AND".
QgsAttributeEditorContext::Mode mode() const
Returns the current mode of the form.
Manages an editor widget Widget and wrapper share the same parent.
ConstraintResult
Result of constraint checks.
Single scope for storing variables and functions for use within a QgsExpressionContext.
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").
Wrapper for iterator of features from vector data provider or vector layer.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Represents an item shown within a QgsMessageBar widget.
A bar for displaying non-blocking messages to the user.
Definition: qgsmessagebar.h:61
The QgsTabWidget class is the same as the QTabWidget but with additional methods to temporarily hide/...
Definition: qgstabwidget.h:30
Represents a vector layer which manages a vector based data sets.
Manages an editor widget Widget and wrapper share the same parent.
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:53
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_OUT
Definition: qgis_sip.h:58
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
const QgsField & field
Definition: qgsfield.h:463