QGIS API Documentation  3.13.0-Master (b73bd58cfb)
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 
186  void allowEvalErrorsChanged();
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
The QgsFieldExpressionWidget class reates a widget to choose fields and edit expressions It contains ...
Base class for all map layer types.
Definition: qgsmaplayer.h:81
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:53
Container of fields for a vector layer.
Definition: qgsfields.h:42
QgsFieldProxyModel::Filters filters() const
currently used filter on list of fields
The QgsFieldProxyModel class provides an easy to use model to display the list of fields of a layer...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
#define SIP_TRANSFER
Definition: qgis_sip.h:36
Single scope for storing variables and functions for use within a QgsExpressionContext.
Abstract interface for generating an expression context.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations...
void setRow(int row)
sets the current row in the widget
Represents a vector layer which manages a vector based data sets.