QGIS API Documentation  3.6.0-Noosa (5873452)
qgscheckboxsearchwidgetwrapper.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgscheckboxsearchwidgetwrapper.cpp
3  ---------------------------------
4  Date : 2016-05-23
5  Copyright : (C) 2016 Nyall Dawson
6  Email : nyall dot dawson at gmail dot com
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 
22 #include <QSettings>
23 #include <QCheckBox>
24 
26  : QgsSearchWidgetWrapper( vl, fieldIdx, parent )
27 
28 {
29 }
30 
32 {
33  return true;
34 }
35 
37 {
38  return mExpression;
39 }
40 
42 {
43  QVariant v;
44 
45  if ( mCheckBox )
46  v = mCheckBox->isChecked() ? config( QStringLiteral( "CheckedState" ) ) : config( QStringLiteral( "UncheckedState" ) );
47 
48  return v;
49 }
50 
51 QgsSearchWidgetWrapper::FilterFlags QgsCheckboxSearchWidgetWrapper::supportedFlags() const
52 {
53  return EqualTo | IsNull | IsNotNull;
54 }
55 
56 QgsSearchWidgetWrapper::FilterFlags QgsCheckboxSearchWidgetWrapper::defaultFlags() const
57 {
58  return EqualTo;
59 }
60 
61 QString QgsCheckboxSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper::FilterFlags flags ) const
62 {
63  QVariant::Type fldType = layer()->fields().at( mFieldIdx ).type();
64  QString fieldName = createFieldIdentifier();
65 
66  //clear any unsupported flags
67  flags &= supportedFlags();
68  if ( flags & IsNull )
69  return fieldName + " IS NULL";
70 
71  if ( flags & IsNotNull )
72  return fieldName + " IS NOT NULL";
73 
74  QVariant v = value();
75  if ( !v.isValid() )
76  return QString();
77 
78  switch ( fldType )
79  {
80  case QVariant::Int:
81  case QVariant::UInt:
82  case QVariant::Double:
83  case QVariant::LongLong:
84  case QVariant::ULongLong:
85  {
86  if ( flags & EqualTo )
87  return fieldName + '=' + v.toString();
88  else if ( flags & NotEqualTo )
89  return fieldName + "<>" + v.toString();
90  break;
91  }
92 
93  default:
94  {
95  if ( flags & EqualTo )
96  return fieldName + "='" + v.toString() + '\'';
97  else if ( flags & NotEqualTo )
98  return fieldName + "<>'" + v.toString() + '\'';
99  break;
100  }
101  }
102 
103  return QString();
104 }
105 
107 {
108  if ( mCheckBox )
109  {
110  whileBlocking( mCheckBox )->setCheckState( Qt::PartiallyChecked );
111  }
112 }
113 
115 {
116  if ( mCheckBox )
117  {
118  mCheckBox->setEnabled( enabled );
119  }
120 }
121 
123 {
124  return true;
125 }
126 
128 {
129  QString exp = expression;
130  QString fieldName = layer()->fields().at( mFieldIdx ).name();
131 
132  QString str = QStringLiteral( "%1 = '%3'" )
133  .arg( QgsExpression::quotedColumnRef( fieldName ),
134  exp.replace( '\'', QLatin1String( "''" ) )
135  );
136  mExpression = str;
137 }
138 
139 void QgsCheckboxSearchWidgetWrapper::stateChanged( int )
140 {
141  if ( mCheckBox )
142  {
143  mCheckBox->setTristate( false );
144  QString exp = value().toString();
145  setExpression( exp );
146  emit valueChanged();
148  }
149 }
150 
152 {
153  QCheckBox *c = new QCheckBox( parent );
154  c->setChecked( Qt::PartiallyChecked );
155  return c;
156 }
157 
159 {
160  mCheckBox = qobject_cast<QCheckBox *>( editor );
161 
162  if ( mCheckBox )
163  {
164  mCheckBox->setChecked( Qt::PartiallyChecked );
165  connect( mCheckBox, &QCheckBox::stateChanged, this, &QgsCheckboxSearchWidgetWrapper::stateChanged );
166  }
167 }
168 
169 
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
Shows a search widget on a filter form.
bool valid() const override
Returns true if the widget has been properly initialized.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
QString name
Definition: qgsfield.h:58
void setExpression(const QString &expression) override
Supports searching for non-null values.
QVariantMap config() const
Returns the whole config.
bool applyDirectly() override
If this is true, then this search widget should take effect directly when its expression changes...
QString createFieldIdentifier() const
Gets a field name or expression to use as field comparison.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
Definition: qgsfields.cpp:163
Supports searching for null values.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QgsSearchWidgetWrapper::FilterFlags defaultFlags() const override
Returns the filter flags which should be set by default for the search widget.
QgsSearchWidgetWrapper::FilterFlags supportedFlags() const override
Returns filter flags supported by the search widget.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
void valueChanged()
Emitted when a user changes the value of the search widget.
void expressionChanged(const QString &exp)
Emitted whenever the expression changes.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
QVariant value() const
Returns a variant representing the current state of the widget.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:212
QString expression() const override
Will be used to access the widget&#39;s value.
QString createExpression(QgsSearchWidgetWrapper::FilterFlags flags) const override
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
Represents a vector layer which manages a vector based data sets.
QVariant::Type type
Definition: qgsfield.h:56
QgsCheckboxSearchWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *parent=nullptr)
Constructor for QgsCheckboxSearchWidgetWrapper.