QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
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 "qgsapplication.h"
19#include "qgsfields.h"
20#include "qgsfilterlineedit.h"
21#include "qgssettings.h"
24#include "qgsvectorlayer.h"
25
26#include <QCompleter>
27#include <QStringListModel>
28
29#include "moc_qgsvaluerelationsearchwidgetwrapper.cpp"
30
32 : QgsSearchWidgetWrapper( vl, fieldIdx, parent )
33
34{
35}
36
38{
39 return !mLineEdit;
40}
41
46
48{
49 QVariant v;
50
51 if ( mComboBox )
52 {
53 int cbxIdx = mComboBox->currentIndex();
54 if ( cbxIdx > -1 )
55 {
56 v = mComboBox->currentData();
57 }
58 }
59
60 if ( mLineEdit )
61 {
62 const auto constMCache = mCache;
63 for ( const QgsValueRelationFieldFormatter::ValueRelationItem &i : constMCache )
64 {
65 if ( i.value == mLineEdit->text() )
66 {
67 v = i.key;
68 break;
69 }
70 }
71 }
72
73 return v;
74}
75
80
85
87{
88 QString fieldName = createFieldIdentifier();
89
90 //clear any unsupported flags
91 flags &= supportedFlags();
92 if ( flags & IsNull )
93 return fieldName + " IS NULL";
94 if ( flags & IsNotNull )
95 return fieldName + " IS NOT NULL";
96
97 QVariant v = value();
98 if ( !v.isValid() )
99 return QString();
100
101 switch ( v.userType() )
102 {
103 case QMetaType::Type::Int:
104 case QMetaType::Type::UInt:
105 case QMetaType::Type::Double:
106 case QMetaType::Type::LongLong:
107 case QMetaType::Type::ULongLong:
108 {
109 if ( flags & EqualTo )
110 return fieldName + '=' + v.toString();
111 else if ( flags & NotEqualTo )
112 return fieldName + "<>" + v.toString();
113 break;
114 }
115
116 default:
117 {
118 if ( flags & EqualTo )
119 return fieldName + "='" + v.toString() + '\'';
120 else if ( flags & NotEqualTo )
121 return fieldName + "<>'" + v.toString() + '\'';
122 break;
123 }
124 }
125
126 return QString();
127}
128
130{
131 if ( mComboBox )
132 {
133 mComboBox->setCurrentIndex( 0 );
134 }
135 if ( mLineEdit )
136 {
137 mLineEdit->setText( QString() );
138 }
139}
140
142{
143 if ( mComboBox )
144 {
145 mComboBox->setEnabled( enabled );
146 }
147 if ( mLineEdit )
148 {
149 mLineEdit->setEnabled( enabled );
150 }
151}
152
154{
155 return true;
156}
157
159{
160 QVariant vl = value();
161 if ( !vl.isValid() )
162 {
164 emit valueCleared();
165 }
166 else
167 {
169 emit valueChanged();
170 }
172}
173
175{
176 QString exp = expression;
177 QString nullValue = QgsApplication::nullRepresentation();
178 QString fieldName = layer()->fields().at( mFieldIdx ).name();
179
180 QString str;
181 if ( exp == nullValue )
182 {
183 str = QStringLiteral( "%1 IS NULL" ).arg( QgsExpression::quotedColumnRef( fieldName ) );
184 }
185 else
186 {
187 str = QStringLiteral( "%1 = '%3'" )
188 .arg( QgsExpression::quotedColumnRef( fieldName ), exp.replace( '\'', QLatin1String( "''" ) ) );
189 }
190 mExpression = str;
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)" ), QgsVariantUtils::createNullVariant( 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}
static QString nullRepresentation()
Returns the string 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:63
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
@ IsNull
Supports searching for null values.
@ IsNotNull
Supports searching for non-null values.
@ NotEqualTo
Supports not equal to.
void valueChanged()
Emitted when a user changes the value of the search widget.
QgsSearchWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *parent=nullptr)
Create a new widget wrapper.
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.
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
Represents a vector layer which manages a vector based dataset.
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
QVariantMap config() const
Returns the whole config.