QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsvaluerelationsearchwidgetwrapper.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsvaluerelationsearchwidgetwrapper.cpp
3 --------------------------------------
4 Date : 5.1.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
17
18#include "qgsfields.h"
20#include "qgsvectorlayer.h"
21#include "qgsfilterlineedit.h"
23#include "qgssettings.h"
24#include "qgsapplication.h"
25
26#include <QStringListModel>
27#include <QCompleter>
28
30 : QgsSearchWidgetWrapper( vl, fieldIdx, parent )
31
32{
33}
34
36{
37 return !mLineEdit;
38}
39
41{
42 return mExpression;
43}
44
46{
47 QVariant v;
48
49 if ( mComboBox )
50 {
51 int cbxIdx = mComboBox->currentIndex();
52 if ( cbxIdx > -1 )
53 {
54 v = mComboBox->currentData();
55 }
56 }
57
58 if ( mLineEdit )
59 {
60 const auto constMCache = mCache;
61 for ( const QgsValueRelationFieldFormatter::ValueRelationItem &i : constMCache )
62 {
63 if ( i.value == mLineEdit->text() )
64 {
65 v = i.key;
66 break;
67 }
68 }
69 }
70
71 return v;
72}
73
75{
77}
78
80{
81 return EqualTo;
82}
83
85{
86 QString fieldName = createFieldIdentifier();
87
88 //clear any unsupported flags
89 flags &= supportedFlags();
90 if ( flags & IsNull )
91 return fieldName + " IS NULL";
92 if ( flags & IsNotNull )
93 return fieldName + " IS NOT NULL";
94
95 QVariant v = value();
96 if ( !v.isValid() )
97 return QString();
98
99 switch ( v.type() )
100 {
101 case QVariant::Int:
102 case QVariant::UInt:
103 case QVariant::Double:
104 case QVariant::LongLong:
105 case QVariant::ULongLong:
106 {
107 if ( flags & EqualTo )
108 return fieldName + '=' + v.toString();
109 else if ( flags & NotEqualTo )
110 return fieldName + "<>" + v.toString();
111 break;
112 }
113
114 default:
115 {
116 if ( flags & EqualTo )
117 return fieldName + "='" + v.toString() + '\'';
118 else if ( flags & NotEqualTo )
119 return fieldName + "<>'" + v.toString() + '\'';
120 break;
121 }
122 }
123
124 return QString();
125}
126
128{
129 if ( mComboBox )
130 {
131 mComboBox->setCurrentIndex( 0 );
132 }
133 if ( mLineEdit )
134 {
135 mLineEdit->setText( QString() );
136 }
137}
138
140{
141 if ( mComboBox )
142 {
143 mComboBox->setEnabled( enabled );
144 }
145 if ( mLineEdit )
146 {
147 mLineEdit->setEnabled( enabled );
148 }
149}
150
152{
153 return true;
154}
155
157{
158 QVariant vl = value();
159 if ( !vl.isValid() )
160 {
162 emit valueCleared();
163 }
164 else
165 {
167 emit valueChanged();
168 }
170}
171
173{
174 QString exp = expression;
175 QString nullValue = QgsApplication::nullRepresentation();
176 QString fieldName = layer()->fields().at( mFieldIdx ).name();
177
178 QString str;
179 if ( exp == nullValue )
180 {
181 str = QStringLiteral( "%1 IS NULL" ).arg( QgsExpression::quotedColumnRef( fieldName ) );
182 }
183 else
184 {
185 str = QStringLiteral( "%1 = '%3'" )
186 .arg( QgsExpression::quotedColumnRef( fieldName ),
187 exp.replace( '\'', QLatin1String( "''" ) )
188 );
189 }
191}
192
194{
195 if ( config( QStringLiteral( "AllowMulti" ) ).toBool() )
196 {
197 return new QgsFilterLineEdit( parent );
198 }
199 else if ( config( QStringLiteral( "UseCompleter" ) ).toBool() )
200 {
201 return new QgsFilterLineEdit( parent );
202 }
203 else
204 {
205 QComboBox *combo = new QComboBox( parent );
206 combo->setMinimumContentsLength( 1 );
207 combo->setSizeAdjustPolicy( QComboBox::SizeAdjustPolicy::AdjustToMinimumContentsLengthWithIcon );
208 return combo;
209 }
210}
211
213{
215
216 mComboBox = qobject_cast<QComboBox *>( editor );
217 mLineEdit = qobject_cast<QLineEdit *>( editor );
218
219 if ( mComboBox )
220 {
221 mComboBox->addItem( tr( "Please Select" ), QVariant() ); // creates an invalid to allow selecting all features
222 if ( config( QStringLiteral( "AllowNull" ) ).toBool() )
223 {
224 mComboBox->addItem( tr( "(no selection)" ), QVariant( layer()->fields().at( mFieldIdx ).type() ) );
225 }
226
227 const auto constMCache = mCache;
228 for ( const QgsValueRelationFieldFormatter::ValueRelationItem &element : constMCache )
229 {
230 mComboBox->addItem( element.value, element.key );
231 }
232
233 connect( mComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsValueRelationSearchWidgetWrapper::onValueChanged );
234 }
235 else if ( mLineEdit )
236 {
237 QStringList values;
238 values.reserve( mCache.size() );
239 for ( const QgsValueRelationFieldFormatter::ValueRelationItem &i : std::as_const( mCache ) )
240 {
241 values << i.value;
242 }
243
244 QStringListModel *m = new QStringListModel( values, mLineEdit );
245 QCompleter *completer = new QCompleter( m, mLineEdit );
246 completer->setCaseSensitivity( Qt::CaseInsensitive );
247 mLineEdit->setCompleter( completer );
248 connect( mLineEdit, &QLineEdit::textChanged, this, &QgsValueRelationSearchWidgetWrapper::onValueChanged );
249 }
250}
251
252
static QString nullRepresentation()
This string is used to represent the value NULL throughout QGIS.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
QString name
Definition: qgsfield.h:62
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Definition: qgsfields.cpp:163
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
Shows a search widget on a filter form.
@ IsNull
Supports searching for null values.
@ IsNotNull
Supports searching for non-null values.
@ EqualTo
Supports equal to.
@ NotEqualTo
Supports not equal to.
void valueChanged()
Emitted when a user changes the value of the search widget.
void valueCleared()
Emitted when a user changes the value of the search widget back to an empty, default state.
void expressionChanged(const QString &exp)
Emitted whenever the expression changes.
QString createFieldIdentifier() const
Gets a field name or expression to use as field comparison.
void clearExpression()
clears the expression to search for all features
QFlags< FilterFlag > FilterFlags
QVariant createCache(QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config) const override
Create a cache for a given field.
bool applyDirectly() override
If this is true, then this search widget should take effect directly when its expression changes.
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
QgsValueRelationSearchWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *parent=nullptr)
Constructor for QgsValueRelationSearchWidgetWrapper.
QgsSearchWidgetWrapper::FilterFlags supportedFlags() const override
Returns filter flags supported by the search widget.
QString expression() const override
Will be used to access the widget's value.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
QgsSearchWidgetWrapper::FilterFlags defaultFlags() const override
Returns the filter flags which should be set by default for the search widget.
bool valid() const override
Returns true if the widget has been properly initialized.
void onValueChanged()
Called when current value of search widget changes.
QString createExpression(QgsSearchWidgetWrapper::FilterFlags flags) const override
Creates a filter expression based on the current state of the search widget and the specified filter ...
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
Represents a vector layer which manages a vector based data sets.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
QVariantMap config() const
Returns the whole config.
#define str(x)
Definition: qgis.cpp:38