QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
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"
23
24#include <QWidget>
25#include <QLabel>
26#include <QDialogButtonBox>
27#include <QMultiMap>
28
29#include "qgis_gui.h"
30
31
34class QgsMessageBar;
37class QgsTabWidget;
40class QSvgWidget;
41
46class GUI_EXPORT QgsAttributeForm : public QWidget
47{
48 Q_OBJECT
49
50 public:
51
53 enum Mode
54 {
56 AddFeatureMode,
61 IdentifyMode
62 };
63
66 {
70 };
71
72 explicit QgsAttributeForm( QgsVectorLayer *vl,
73 const QgsFeature &feature = QgsFeature(),
75 QWidget *parent SIP_TRANSFERTHIS = nullptr );
76 ~QgsAttributeForm() override;
77
78 const QgsFeature &feature() { return mFeature; }
79
86 QgsFeature currentFormFeature() const { return mCurrentFormFeature; }
87
94 void displayWarning( const QString &message );
95
96 // TODO QGIS 4.0 - make private
97
102 void hideButtonBox();
103
104 // TODO QGIS 4.0 - make private
105
110 void showButtonBox();
111
112 // TODO QGIS 4.0 - make private
113
118 void disconnectButtonBox();
119
124 void addInterface( QgsAttributeFormInterface *iface SIP_TRANSFER );
125
131 QgsVectorLayer *layer() { return mLayer; }
132
138 bool editable();
139
145 QgsAttributeEditorContext::Mode mode() const { return mMode; }
146
153 void setMode( QgsAttributeEditorContext::Mode mode );
154
160 void setEditCommandMessage( const QString &message ) { mEditCommandMessage = message; }
161
170 bool eventFilter( QObject *object, QEvent *event ) override;
171
177 void setMultiEditFeatureIds( const QgsFeatureIds &fids );
178
185 void setMessageBar( QgsMessageBar *messageBar );
186
194 QString aggregateFilter() const;
195
202 void setExtraContextScope( QgsExpressionContextScope *extraScope SIP_TRANSFER );
203
204 signals:
205
214 Q_DECL_DEPRECATED void attributeChanged( const QString &attribute, const QVariant &value ) SIP_DEPRECATED;
215
224 void widgetValueChanged( const QString &attribute, const QVariant &value, bool attributeChanged );
225
234 void beforeSave( bool &ok ) SIP_SKIP;
235
239 void featureSaved( const QgsFeature &feature );
240
247 void filterExpressionSet( const QString &expression, QgsAttributeForm::FilterType type );
248
254
259 void closed();
260
265 void zoomToFeatures( const QString &filter );
266
271 void flashFeatures( const QString &filter );
272
277 void openFilteredFeaturesAttributeTable( const QString &filter );
278
279
280 public slots:
281
289 void changeAttribute( const QString &field, const QVariant &value, const QString &hintText = QString() );
290
296 void setFeature( const QgsFeature &feature );
297
303 bool save();
304
314 bool saveWithDetails( QString *error SIP_OUT = nullptr );
315
319 void resetValues();
320
325 void resetSearch();
326
330 void refreshFeature();
331
341 void parentFormValueChanged( const QString &attribute, const QVariant &newValue );
342
347 bool needsGeometry() const;
348
349 private slots:
350 void onAttributeChanged( const QVariant &value, const QVariantList &additionalFieldValues );
351 void onAttributeAdded( int idx );
352 void onAttributeDeleted( int idx );
353 void onRelatedFeaturesChanged();
354 void onUpdatedFields();
355 void onConstraintStatusChanged( const QString &constraint,
356 const QString &description, const QString &err, QgsEditorWidgetWrapper::ConstraintResult result );
357 void preventFeatureRefresh();
358 void synchronizeState();
359 void layerSelectionChanged();
360
362 bool saveMultiEdits();
363 void resetMultiEdit( bool promptToSave = false );
364 void multiEditMessageClicked( const QString &link );
365
366 void filterAndTriggered();
367 void filterOrTriggered();
368 void filterTriggered();
369
370 void searchZoomTo();
371 void searchFlash();
372 void searchSetSelection();
373 void searchAddToSelection();
374 void searchRemoveFromSelection();
375 void searchIntersectSelection();
376
377 private:
378 void init();
379
380 void cleanPython();
381
382 void initPython();
383
384 void updateJoinedFields( const QgsEditorWidgetWrapper &eww );
385
386 bool fieldIsEditable( int fieldIndex ) const;
387
388 bool fieldIsEditable( const QgsVectorLayer &layer, int fieldIndex, QgsFeatureId fid ) const;
389
390 void updateFieldDependencies();
391 void updateFieldDependenciesDefaultValue( QgsEditorWidgetWrapper *eww );
392 void updateFieldDependenciesVirtualFields( QgsEditorWidgetWrapper *eww );
393 void updateRelatedLayerFieldsDependencies( QgsEditorWidgetWrapper *eww = nullptr );
394
395 void setMultiEditFeatureIdsRelations( const QgsFeatureIds &fids );
396
397 struct WidgetInfo
398 {
399 QWidget *widget = nullptr;
400 QString labelText;
401 QString toolTip;
402 QString hint;
403 bool labelOnTop = false;
404 bool labelAlignRight = false;
405 bool showLabel = true;
407 };
408
409 WidgetInfo createWidgetFromDef( const QgsAttributeEditorElement *widgetDef, QWidget *parent, QgsVectorLayer *vl, QgsAttributeEditorContext &context );
410
411 void addWidgetWrapper( QgsEditorWidgetWrapper *eww );
412
417 void createWrappers();
418 void afterWidgetInit();
419
420 void scanForEqualAttributes( QgsFeatureIterator &fit, QSet< int > &mixedValueFields, QHash< int, QVariant > &fieldSharedValues ) const;
421
423 bool saveEdits( QString *error );
424
425 QgsFeature getUpdatedFeature() const;
426
428 void updateValuesDependencies( const int originIdx );
429 void updateValuesDependenciesDefaultValues( const int originIdx );
430 void updateValuesDependenciesVirtualFields( const int originIdx );
431 void updateRelatedLayerFields();
432
433 void clearMultiEditMessages();
434 void pushSelectedFeaturesMessage();
435 void runSearchSelect( Qgis::SelectBehavior behavior );
436
437 QString createFilterExpression() const;
438
439 QgsExpressionContext createExpressionContext( const QgsFeature &feature ) const;
440
442 void updateAllConstraints();
443 void updateConstraints( QgsEditorWidgetWrapper *w );
444 void updateContainersVisibility();
445 void updateConstraint( const QgsFeature &ft, QgsEditorWidgetWrapper *eww );
446 void updateLabels();
447 bool currentFormValuesFeature( QgsFeature &feature );
448 bool currentFormValidConstraints( QStringList &invalidFields, QStringList &descriptions ) const;
449 bool currentFormValidHardConstraints( QStringList &invalidFields, QStringList &descriptions ) const;
450 QList<QgsEditorWidgetWrapper *> constraintDependencies( QgsEditorWidgetWrapper *w );
451
452 Q_DECL_DEPRECATED QgsRelationWidgetWrapper *setupRelationWidgetWrapper( const QgsRelation &rel, const QgsAttributeEditorContext &context ) SIP_DEPRECATED;
453 QgsRelationWidgetWrapper *setupRelationWidgetWrapper( const QString &relationWidgetTypeId, const QgsRelation &rel, const QgsAttributeEditorContext &context );
454
455 QgsVectorLayer *mLayer = nullptr;
456 QgsFeature mFeature;
457 QgsFeature mCurrentFormFeature;
458 QgsMessageBar *mMessageBar = nullptr;
459 bool mOwnsMessageBar;
460 QgsMessageBarItem *mMultiEditUnsavedMessageBarItem = nullptr;
461 QgsMessageBarItem *mMultiEditMessageBarItem = nullptr;
462 QList<QgsWidgetWrapper *> mWidgets;
464 std::unique_ptr<QgsExpressionContextScope> mExtraContextScope;
465 QDialogButtonBox *mButtonBox = nullptr;
466 QWidget *mSearchButtonBox = nullptr;
467 QList<QgsAttributeFormInterface *> mInterfaces;
468 QMap< int, QgsAttributeFormEditorWidget * > mFormEditorWidgets;
469 QList< QgsAttributeFormWidget *> mFormWidgets;
470 QMap<const QgsVectorLayerJoinInfo *, QgsFeature> mJoinedFeatures;
471 QMap<QLabel *, QgsProperty> mLabelDataDefinedProperties;
472 bool mValuesInitialized = false;
473 bool mDirty = false;
474 bool mIsSettingFeature = false;
475
476 bool mValidConstraints = true;
477 QgsMessageBarItem *mConstraintsFailMessageBarItem = nullptr;
478
479 struct ContainerInformation
480 {
481 ContainerInformation( QgsTabWidget *tabWidget, QWidget *widget, const QgsExpression &expression )
482 : tabWidget( tabWidget )
483 , widget( widget )
484 , expression( expression )
485 , isVisible( true )
486 {}
487
488 ContainerInformation( QWidget *widget, const QgsExpression &expression )
489 : widget( widget )
490 , expression( expression )
491 , isVisible( true )
492 {}
493
494 ContainerInformation( QWidget *widget, const QgsExpression &visibilityExpression, bool collapsed, const QgsExpression &collapsedExpression )
495 : widget( widget )
496 , expression( visibilityExpression )
497 , isVisible( true )
498 , isCollapsed( collapsed )
499 , collapsedExpression( collapsedExpression )
500 {}
501
502
503 QgsTabWidget *tabWidget = nullptr;
504 QWidget *widget = nullptr;
505 QgsExpression expression;
506 bool isVisible;
507 bool isCollapsed = false;
508 QgsExpression collapsedExpression;
509
510 void apply( QgsExpressionContext *expressionContext );
511 };
512
513 void registerContainerInformation( ContainerInformation *info );
514
515 void updateIcon( QgsEditorWidgetWrapper *eww );
516
517 void reloadIcon( const QString &file, const QString &tooltip, QSvgWidget *sw );
518
519 // Contains information about tabs and groupboxes, their visibility/collapsed state conditions
520 QVector<ContainerInformation *> mContainerVisibilityCollapsedInformation;
521 QMap<QString, QVector<ContainerInformation *> > mContainerInformationDependency;
522
523 // Variables below are used for Python
524 static int sFormCounter;
525 int mFormNr;
526 QString mPyFormVarName;
527
529 bool mIsSaving;
530
532 bool mPreventFeatureRefresh;
533
534 bool mIsSettingMultiEditFeatures;
535
536 QgsFeatureIds mMultiEditFeatureIds;
537 bool mUnsavedMultiEditChanges;
538
539 QString mEditCommandMessage;
540
542
543 QMap<QWidget *, QSvgWidget *> mIconMap;
544
549 QMultiMap<int, QgsWidgetWrapper *> mDefaultValueDependencies;
550
555 QMultiMap<int, QgsWidgetWrapper *> mVirtualFieldsDependencies;
556
560 QSet<QgsEditorWidgetWrapper *> mRelatedLayerFieldsDependencies;
561
563 QList<int> mAlreadyUpdatedFields;
564
565 bool mNeedsGeometry = false;
566
567 friend class TestQgsDualView;
568 friend class TestQgsAttributeForm;
569};
570
571#endif // QGSATTRIBUTEFORM_H
SelectBehavior
Specifies how a selection should be applied.
Definition: qgis.h:798
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.
QgsVectorLayer * layer()
Returns the layer for which this form is shown.
void beforeSave(bool &ok)
Will be emitted before the feature is saved.
@ 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.
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 openFilteredFeaturesAttributeTable(const QString &filter)
Emitted when the user chooses to open the attribute table dialog with a filtered set of features.
void flashFeatures(const QString &filter)
Emitted when the user chooses to flash a filtered set of features.
const QgsFeature & feature()
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:33
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
The TabStyle struct defines color and font overrides for form fields, tabs and groups labels.