QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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
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"
29#include "qgsfieldproxymodel.h"
30
31
32class QgsMapLayer;
33class QgsVectorLayer;
35
36
46class 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 Q_PROPERTY( bool buttonVisible READ buttonVisible WRITE setButtonVisible NOTIFY buttonVisibleChanged )
54
55 public:
56
60 explicit QgsFieldExpressionWidget( QWidget *parent SIP_TRANSFERTHIS = nullptr );
61
63 void setExpressionDialogTitle( const QString &title );
64
72 void appendScope( QgsExpressionContextScope *scope SIP_TRANSFER );
73
75 const QString expressionDialogTitle() { return mExpressionDialogTitle; }
76
78 void setFilters( QgsFieldProxyModel::Filters filters );
79
85 void setAllowEmptyFieldName( bool allowEmpty );
86
92 bool allowEmptyFieldName() const;
93
94 void setLeftHandButtonStyle( bool isLeft );
95
97 QgsFieldProxyModel::Filters filters() const { return mFieldProxyModel->filters(); }
98
100 void setGeomCalculator( const QgsDistanceArea &da );
101
107 QString currentField( bool *isExpression = nullptr, bool *isValid = nullptr ) const;
108
112 bool isValidExpression( QString *expressionError = nullptr ) const;
113
117 bool isExpression() const;
118
122 QString currentText() const;
123
129 QString asExpression() const;
130
139 QString expression() const;
140
145 QgsVectorLayer *layer() const;
146
153 void registerExpressionContextGenerator( const QgsExpressionContextGenerator *generator );
154
155#ifndef SIP_RUN
156
170 void setCustomPreviewGenerator( const QString &label, const QList< QPair< QString, QVariant > > &choices, const std::function< QgsExpressionContext( const QVariant & ) > &previewContextGenerator );
171#else
172
186 void setCustomPreviewGenerator( const QString &label, const QList< QPair< QString, QVariant > > &choices, SIP_PYCALLABLE );
187 % MethodCode
188 Py_XINCREF( a2 );
189 Py_BEGIN_ALLOW_THREADS
190 sipCpp->setCustomPreviewGenerator( *a0, *a1, [a2]( const QVariant &value )->QgsExpressionContext
191 {
193 SIP_BLOCK_THREADS
194 PyObject *s = sipCallMethod( NULL, a2, "D", &value, sipType_QVariant, NULL );
195 int state;
196 int sipIsError = 0;
197 QgsExpressionContext *t1 = reinterpret_cast<QgsExpressionContext *>( sipConvertToType( s, sipType_QgsExpressionContext, 0, SIP_NOT_NONE, &state, &sipIsError ) );
198 if ( sipIsError == 0 )
199 {
200 res = QgsExpressionContext( *t1 );
201 }
202 sipReleaseType( t1, sipType_QgsExpressionContext, state );
203 SIP_UNBLOCK_THREADS
204 return res;
205 } );
206
207 Py_END_ALLOW_THREADS
208 % End
209#endif
210
216 bool allowEvalErrors() const;
217
223 void setAllowEvalErrors( bool allowEvalErrors );
224
232 bool buttonVisible() const;
233
241 void setButtonVisible( bool visible );
242
243 signals:
245 void fieldChanged( const QString &fieldName );
246
248 void fieldChanged( const QString &fieldName, bool isValid );
249
256
263
264 public slots:
265
270 void setLayer( QgsMapLayer *layer );
271
273 void setRow( int row ) { mCombo->setCurrentIndex( row ); }
274
276 void setField( const QString &fieldName );
277
282 void setFields( const QgsFields &fields );
283
289 void setExpression( const QString &expression );
290
291 protected slots:
293 void editExpression();
294
296 void expressionEdited( const QString &expression );
297
299 void expressionEditingFinished();
300
301 void currentFieldChanged();
302
308 void updateLineEditStyle( const QString &expression = QString() );
309
310 bool isExpressionValid( const QString &expressionStr );
311
312 protected:
313 void changeEvent( QEvent *event ) override;
314
315 bool eventFilter( QObject *watched, QEvent *event ) override;
316
317 private slots:
318 void reloadLayer();
319
320 void beforeResetModel();
321 void afterResetModel();
322
323 private:
324 QComboBox *mCombo = nullptr;
325 QToolButton *mButton = nullptr;
326 QgsFieldProxyModel *mFieldProxyModel = nullptr;
327 QString mExpressionDialogTitle;
328 std::shared_ptr<const QgsDistanceArea> mDistanceArea;
329 QgsExpressionContext mExpressionContext;
330 const QgsExpressionContextGenerator *mExpressionContextGenerator = nullptr;
331 QString mBackupExpression;
332 bool mAllowEvalErrors = false;
333
334 QString mCustomPreviewLabel;
335 QList< QPair< QString, QVariant > > mCustomChoices;
336 std::function< QgsExpressionContext( const QVariant & ) > mPreviewContextGenerator;
337
338 friend class TestQgsFieldExpressionWidget;
339};
340
341#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 creates 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 buttonVisibleChanged()
Emitted when the button visibility changes.
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.
QFlags< Filter > Filters
Container of fields for a vector layer.
Definition: qgsfields.h:45
Base class for all map layer types.
Definition: qgsmaplayer.h:75
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