QGIS API Documentation  3.21.0-Master (5b68dc587e)
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 onUpdatedFields();
345  void onConstraintStatusChanged( const QString &constraint,
346  const QString &description, const QString &err, QgsEditorWidgetWrapper::ConstraintResult result );
347  void preventFeatureRefresh();
348  void synchronizeState();
349  void layerSelectionChanged();
350 
352  bool saveMultiEdits();
353  void resetMultiEdit( bool promptToSave = false );
354  void multiEditMessageClicked( const QString &link );
355 
356  void filterAndTriggered();
357  void filterOrTriggered();
358  void filterTriggered();
359 
360  void searchZoomTo();
361  void searchFlash();
362  void searchSetSelection();
363  void searchAddToSelection();
364  void searchRemoveFromSelection();
365  void searchIntersectSelection();
366 
367  private:
368  void init();
369 
370  void cleanPython();
371 
372  void initPython();
373 
374  void updateJoinedFields( const QgsEditorWidgetWrapper &eww );
375 
376  bool fieldIsEditable( int fieldIndex ) const;
377 
378  bool fieldIsEditable( const QgsVectorLayer &layer, int fieldIndex, QgsFeatureId fid ) const;
379 
380  void updateDefaultValueDependencies();
381 
382  struct WidgetInfo
383  {
384  QWidget *widget = nullptr;
385  QString labelText;
386  QString toolTip;
387  QString hint;
388  bool labelOnTop = false;
389  bool labelAlignRight = false;
390  bool showLabel = true;
391  };
392 
393  WidgetInfo createWidgetFromDef( const QgsAttributeEditorElement *widgetDef, QWidget *parent, QgsVectorLayer *vl, QgsAttributeEditorContext &context );
394 
395  void addWidgetWrapper( QgsEditorWidgetWrapper *eww );
396 
401  void createWrappers();
402  void afterWidgetInit();
403 
404  void scanForEqualAttributes( QgsFeatureIterator &fit, QSet< int > &mixedValueFields, QHash< int, QVariant > &fieldSharedValues ) const;
405 
407  bool saveEdits( QString *error );
408 
410  void createDefaultValueDependencies();
411 
413  bool updateDefaultValues( const int originIdx );
414 
415  void clearMultiEditMessages();
416  void pushSelectedFeaturesMessage();
417  void runSearchSelect( Qgis::SelectBehavior behavior );
418 
419  QString createFilterExpression() const;
420 
421  QgsExpressionContext createExpressionContext( const QgsFeature &feature ) const;
422 
424  void updateAllConstraints();
425  void updateConstraints( QgsEditorWidgetWrapper *w );
426  void updateContainersVisibility();
427  void updateConstraint( const QgsFeature &ft, QgsEditorWidgetWrapper *eww );
428  void updateLabels();
429  bool currentFormValuesFeature( QgsFeature &feature );
430  bool currentFormValidConstraints( QStringList &invalidFields, QStringList &descriptions );
431  QList<QgsEditorWidgetWrapper *> constraintDependencies( QgsEditorWidgetWrapper *w );
432 
433  Q_DECL_DEPRECATED QgsRelationWidgetWrapper *setupRelationWidgetWrapper( const QgsRelation &rel, const QgsAttributeEditorContext &context ) SIP_DEPRECATED;
434  QgsRelationWidgetWrapper *setupRelationWidgetWrapper( const QString &relationWidgetTypeId, const QgsRelation &rel, const QgsAttributeEditorContext &context );
435 
436  QgsVectorLayer *mLayer = nullptr;
437  QgsFeature mFeature;
438  QgsFeature mCurrentFormFeature;
439  QgsMessageBar *mMessageBar = nullptr;
440  bool mOwnsMessageBar;
441  QgsMessageBarItem *mMultiEditUnsavedMessageBarItem = nullptr;
442  QgsMessageBarItem *mMultiEditMessageBarItem = nullptr;
443  QList<QgsWidgetWrapper *> mWidgets;
444  QgsAttributeEditorContext mContext;
445  std::unique_ptr<QgsExpressionContextScope> mExtraContextScope;
446  QDialogButtonBox *mButtonBox = nullptr;
447  QWidget *mSearchButtonBox = nullptr;
448  QList<QgsAttributeFormInterface *> mInterfaces;
449  QMap< int, QgsAttributeFormEditorWidget * > mFormEditorWidgets;
450  QList< QgsAttributeFormWidget *> mFormWidgets;
451  QMap<const QgsVectorLayerJoinInfo *, QgsFeature> mJoinedFeatures;
452  QMap<QLabel *, QgsProperty> mLabelDataDefinedProperties;
453  bool mValuesInitialized = false;
454  bool mDirty = false;
455  bool mIsSettingFeature = false;
456 
457  bool mValidConstraints = true;
458  QgsMessageBarItem *mConstraintsFailMessageBarItem = nullptr;
459 
460  struct ContainerInformation
461  {
462  ContainerInformation( QgsTabWidget *tabWidget, QWidget *widget, const QgsExpression &expression )
463  : tabWidget( tabWidget )
464  , widget( widget )
465  , expression( expression )
466  , isVisible( true )
467  {}
468 
469  ContainerInformation( QWidget *widget, const QgsExpression &expression )
470  : widget( widget )
471  , expression( expression )
472  , isVisible( true )
473  {}
474 
475  QgsTabWidget *tabWidget = nullptr;
476  QWidget *widget = nullptr;
477  QgsExpression expression;
478  bool isVisible;
479 
480  void apply( QgsExpressionContext *expressionContext );
481  };
482 
483  void registerContainerInformation( ContainerInformation *info );
484 
485  void updateIcon( QgsEditorWidgetWrapper *eww );
486 
487  void reloadIcon( const QString &file, const QString &tooltip, QSvgWidget *sw );
488 
489  // Contains information about tabs and groupboxes, their visibility state visibility conditions
490  QVector<ContainerInformation *> mContainerVisibilityInformation;
491  QMap<QString, QVector<ContainerInformation *> > mContainerInformationDependency;
492 
493  // Variables below are used for Python
494  static int sFormCounter;
495  int mFormNr;
496  QString mPyFormVarName;
497 
499  bool mIsSaving;
500 
502  bool mPreventFeatureRefresh;
503 
504  bool mIsSettingMultiEditFeatures;
505 
506  QgsFeatureIds mMultiEditFeatureIds;
507  bool mUnsavedMultiEditChanges;
508 
509  QString mEditCommandMessage;
510 
512 
513  QMap<QWidget *, QSvgWidget *> mIconMap;
514 
519  QMap<int, QgsWidgetWrapper *> mDefaultValueDependencies;
520 
522  QList<int> mAlreadyUpdatedFields;
523 
524  bool mNeedsGeometry = false;
525 
526  friend class TestQgsDualView;
527  friend class TestQgsAttributeForm;
528 };
529 
530 #endif // QGSATTRIBUTEFORM_H
SelectBehavior
Specifies how a selection should be applied.
Definition: qgis.h:545
This class contains context information for attribute editor widgets.
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