QGIS API Documentation  3.23.0-Master (eb871beae0)
qgsfieldexpressionwidget.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsfieldexpressionwidget.h
3  --------------------------------------
4  Date : 01.04.2014
5  Copyright : (C) 2014 Denis Rouzaud
6  Email : [email protected]
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 QGSFIELDEXPRESSIONWIDGET_H
17 #define QGSFIELDEXPRESSIONWIDGET_H
18 
19 #include <QColor>
20 #include <QComboBox>
21 #include <QToolButton>
22 #include <QWidget>
23 #include <memory>
24 
25 #include "qgis_gui.h"
26 #include "qgis_sip.h"
27 #include "qgsdistancearea.h"
28 #include "qgsexpressioncontext.h"
29 #include "qgsfieldproxymodel.h"
30 
31 
32 class QgsMapLayer;
33 class QgsVectorLayer;
35 
36 
46 class GUI_EXPORT QgsFieldExpressionWidget : public QWidget
47 {
48  Q_OBJECT
49  Q_PROPERTY( QString expressionDialogTitle READ expressionDialogTitle WRITE setExpressionDialogTitle )
50  Q_PROPERTY( QgsFieldProxyModel::Filters filters READ filters WRITE setFilters )
51  Q_PROPERTY( bool allowEmptyFieldName READ allowEmptyFieldName WRITE setAllowEmptyFieldName )
52  Q_PROPERTY( bool allowEvalErrors READ allowEvalErrors WRITE setAllowEvalErrors NOTIFY allowEvalErrorsChanged )
53 
54  public:
55 
59  explicit QgsFieldExpressionWidget( QWidget *parent SIP_TRANSFERTHIS = nullptr );
60 
62  void setExpressionDialogTitle( const QString &title );
63 
71  void appendScope( QgsExpressionContextScope *scope SIP_TRANSFER );
72 
74  const QString expressionDialogTitle() { return mExpressionDialogTitle; }
75 
77  void setFilters( QgsFieldProxyModel::Filters filters );
78 
84  void setAllowEmptyFieldName( bool allowEmpty );
85 
91  bool allowEmptyFieldName() const;
92 
93  void setLeftHandButtonStyle( bool isLeft );
94 
96  QgsFieldProxyModel::Filters filters() const { return mFieldProxyModel->filters(); }
97 
99  void setGeomCalculator( const QgsDistanceArea &da );
100 
106  QString currentField( bool *isExpression = nullptr, bool *isValid = nullptr ) const;
107 
111  bool isValidExpression( QString *expressionError = nullptr ) const;
112 
116  bool isExpression() const;
117 
121  QString currentText() const;
122 
129  QString asExpression() const;
130 
140  QString expression() const;
141 
146  QgsVectorLayer *layer() const;
147 
155  void registerExpressionContextGenerator( const QgsExpressionContextGenerator *generator );
156 
163  bool allowEvalErrors() const;
164 
171  void setAllowEvalErrors( bool allowEvalErrors );
172 
173  signals:
175  void fieldChanged( const QString &fieldName );
176 
178  void fieldChanged( const QString &fieldName, bool isValid );
179 
187 
188  public slots:
189 
194  void setLayer( QgsMapLayer *layer );
195 
197  void setRow( int row ) { mCombo->setCurrentIndex( row ); }
198 
200  void setField( const QString &fieldName );
201 
206  void setFields( const QgsFields &fields );
207 
214  void setExpression( const QString &expression );
215 
216  protected slots:
218  void editExpression();
219 
221  void expressionEdited( const QString &expression );
222 
224  void expressionEditingFinished();
225 
226  void currentFieldChanged();
227 
233  void updateLineEditStyle( const QString &expression = QString() );
234 
235  bool isExpressionValid( const QString &expressionStr );
236 
237  protected:
238  void changeEvent( QEvent *event ) override;
239 
240  bool eventFilter( QObject *watched, QEvent *event ) override;
241 
242  private slots:
243  void reloadLayer();
244 
245  void beforeResetModel();
246  void afterResetModel();
247 
248  private:
249  QComboBox *mCombo = nullptr;
250  QToolButton *mButton = nullptr;
251  QgsFieldProxyModel *mFieldProxyModel = nullptr;
252  QString mExpressionDialogTitle;
253  std::shared_ptr<const QgsDistanceArea> mDistanceArea;
254  QgsExpressionContext mExpressionContext;
255  const QgsExpressionContextGenerator *mExpressionContextGenerator = nullptr;
256  QString mBackupExpression;
257  bool mAllowEvalErrors = false;
258 
259  friend class TestQgsFieldExpressionWidget;
260 };
261 
262 #endif // QGSFIELDEXPRESSIONWIDGET_H
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
Abstract interface for generating an expression context.
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...
The QgsFieldExpressionWidget class reates a widget to choose fields and edit expressions It contains ...
const QString expressionDialogTitle()
Returns the title used for the expression dialog.
QgsFieldProxyModel::Filters filters() const
currently used filter on list of fields
void setRow(int row)
sets the current row in the widget
void fieldChanged(const QString &fieldName, bool isValid)
fieldChanged signal with indication of the validity of the expression
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
void allowEvalErrorsChanged()
Allow accepting expressions with evaluation errors.
The QgsFieldProxyModel class provides an easy to use model to display the list of fields of a layer.
Container of fields for a vector layer.
Definition: qgsfields.h:45
Base class for all map layer types.
Definition: qgsmaplayer.h:73
Represents a vector layer which manages a vector based data sets.
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:53
#define SIP_TRANSFER
Definition: qgis_sip.h:36