QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
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 <QString>
28#include <QStringListModel>
29
30#include "moc_qgsvaluerelationsearchwidgetwrapper.cpp"
31
32using namespace Qt::StringLiterals;
33
35 : QgsSearchWidgetWrapper( vl, fieldIdx, parent )
36
37{}
38
40{
41 return !mLineEdit;
42}
43
48
50{
51 QVariant v;
52
53 if ( mComboBox )
54 {
55 int cbxIdx = mComboBox->currentIndex();
56 if ( cbxIdx > -1 )
57 {
58 v = mComboBox->currentData();
59 }
60 }
61
62 if ( mLineEdit )
63 {
64 const auto constMCache = mCache;
65 for ( const QgsValueRelationFieldFormatter::ValueRelationItem &i : constMCache )
66 {
67 if ( i.value == mLineEdit->text() )
68 {
69 v = i.key;
70 break;
71 }
72 }
73 }
74
75 return v;
76}
77
82
87
89{
90 QString fieldName = createFieldIdentifier();
91
92 //clear any unsupported flags
93 flags &= supportedFlags();
94 if ( flags & IsNull )
95 return fieldName + " IS NULL";
96 if ( flags & IsNotNull )
97 return fieldName + " IS NOT NULL";
98
99 QVariant v = value();
100 if ( !v.isValid() )
101 return QString();
102
103 switch ( v.userType() )
104 {
105 case QMetaType::Type::Int:
106 case QMetaType::Type::UInt:
107 case QMetaType::Type::Double:
108 case QMetaType::Type::LongLong:
109 case QMetaType::Type::ULongLong:
110 {
111 if ( flags & EqualTo )
112 return fieldName + '=' + v.toString();
113 else if ( flags & NotEqualTo )
114 return fieldName + "<>" + v.toString();
115 break;
116 }
117
118 default:
119 {
120 if ( flags & EqualTo )
121 return fieldName + "='" + v.toString() + '\'';
122 else if ( flags & NotEqualTo )
123 return fieldName + "<>'" + v.toString() + '\'';
124 break;
125 }
126 }
127
128 return QString();
129}
130
132{
133 if ( mComboBox )
134 {
135 mComboBox->setCurrentIndex( 0 );
136 }
137 if ( mLineEdit )
138 {
139 mLineEdit->setText( QString() );
140 }
141}
142
144{
145 if ( mComboBox )
146 {
147 mComboBox->setEnabled( enabled );
148 }
149 if ( mLineEdit )
150 {
151 mLineEdit->setEnabled( enabled );
152 }
153}
154
156{
157 return true;
158}
159
161{
162 QVariant vl = value();
163 if ( !vl.isValid() )
164 {
166 emit valueCleared();
167 }
168 else
169 {
171 emit valueChanged();
172 }
174}
175
177{
178 QString exp = expression;
179 QString nullValue = QgsApplication::nullRepresentation();
180 QString fieldName = layer()->fields().at( mFieldIdx ).name();
181
182 QString str;
183 if ( exp == nullValue )
184 {
185 str = u"%1 IS NULL"_s.arg( QgsExpression::quotedColumnRef( fieldName ) );
186 }
187 else
188 {
189 str = u"%1 = '%3'"_s.arg( QgsExpression::quotedColumnRef( fieldName ), exp.replace( '\'', "''"_L1 ) );
190 }
191 mExpression = str;
192}
193
195{
196 if ( config( u"AllowMulti"_s ).toBool() )
197 {
198 return new QgsFilterLineEdit( parent );
199 }
200 else if ( config( u"UseCompleter"_s ).toBool() )
201 {
202 return new QgsFilterLineEdit( parent );
203 }
204 else
205 {
206 QComboBox *combo = new QComboBox( parent );
207 combo->setMinimumContentsLength( 1 );
208 combo->setSizeAdjustPolicy( QComboBox::SizeAdjustPolicy::AdjustToMinimumContentsLengthWithIcon );
209 return combo;
210 }
211}
212
214{
216
217 mComboBox = qobject_cast<QComboBox *>( editor );
218 mLineEdit = qobject_cast<QLineEdit *>( editor );
219
220 if ( mComboBox )
221 {
222 mComboBox->addItem( tr( "Please Select" ), QVariant() ); // creates an invalid to allow selecting all features
223 if ( config( u"AllowNull"_s ).toBool() )
224 {
225 mComboBox->addItem( tr( "(no selection)" ), QgsVariantUtils::createNullVariant( layer()->fields().at( mFieldIdx ).type() ) );
226 }
227
228 const auto constMCache = mCache;
229 for ( const QgsValueRelationFieldFormatter::ValueRelationItem &element : constMCache )
230 {
231 mComboBox->addItem( element.value, element.key );
232 }
233
234 connect( mComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsValueRelationSearchWidgetWrapper::onValueChanged );
235 }
236 else if ( mLineEdit )
237 {
238 QStringList values;
239 values.reserve( mCache.size() );
240 for ( const QgsValueRelationFieldFormatter::ValueRelationItem &i : std::as_const( mCache ) )
241 {
242 values << i.value;
243 }
244
245 QStringListModel *m = new QStringListModel( values, mLineEdit );
246 QCompleter *completer = new QCompleter( m, mLineEdit );
247 completer->setCaseSensitivity( Qt::CaseInsensitive );
248 mLineEdit->setCompleter( completer );
249 connect( mLineEdit, &QLineEdit::textChanged, this, &QgsValueRelationSearchWidgetWrapper::onValueChanged );
250 }
251}
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:65
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.