QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgsquerybuilder.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsquerybuilder.cpp - Query Builder
3  --------------------------------------
4  Date : 2004-11-19
5  Copyright : (C) 2004 by Gary E.Sherman
6  Email : sherman at mrcc.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 #include "qgsquerybuilder.h"
16 #include "qgslogger.h"
17 #include "qgsproject.h"
18 #include "qgssettings.h"
19 #include "qgsvectorlayer.h"
20 #include "qgsvectordataprovider.h"
21 #include "qgsapplication.h"
22 #include "qgshelp.h"
23 #include "qgsgui.h"
24 
25 #include <QDomDocument>
26 #include <QDomElement>
27 #include <QFileDialog>
28 #include <QInputDialog>
29 #include <QListView>
30 #include <QMessageBox>
31 #include <QRegExp>
32 #include <QPushButton>
33 #include <QTextStream>
34 
35 
36 // constructor used when the query builder must make its own
37 // connection to the database
39  QWidget *parent, Qt::WindowFlags fl )
40  : QDialog( parent, fl )
41  , mPreviousFieldRow( -1 )
42  , mLayer( layer )
43 {
44  setupUi( this );
46  connect( btnEqual, &QPushButton::clicked, this, &QgsQueryBuilder::btnEqual_clicked );
47  connect( btnLessThan, &QPushButton::clicked, this, &QgsQueryBuilder::btnLessThan_clicked );
48  connect( btnGreaterThan, &QPushButton::clicked, this, &QgsQueryBuilder::btnGreaterThan_clicked );
49  connect( btnPct, &QPushButton::clicked, this, &QgsQueryBuilder::btnPct_clicked );
50  connect( btnIn, &QPushButton::clicked, this, &QgsQueryBuilder::btnIn_clicked );
51  connect( btnNotIn, &QPushButton::clicked, this, &QgsQueryBuilder::btnNotIn_clicked );
52  connect( btnLike, &QPushButton::clicked, this, &QgsQueryBuilder::btnLike_clicked );
53  connect( btnILike, &QPushButton::clicked, this, &QgsQueryBuilder::btnILike_clicked );
54  connect( lstFields, &QListView::clicked, this, &QgsQueryBuilder::lstFields_clicked );
55  connect( lstFields, &QListView::doubleClicked, this, &QgsQueryBuilder::lstFields_doubleClicked );
56  connect( lstValues, &QListView::doubleClicked, this, &QgsQueryBuilder::lstValues_doubleClicked );
57  connect( btnLessEqual, &QPushButton::clicked, this, &QgsQueryBuilder::btnLessEqual_clicked );
58  connect( btnGreaterEqual, &QPushButton::clicked, this, &QgsQueryBuilder::btnGreaterEqual_clicked );
59  connect( btnNotEqual, &QPushButton::clicked, this, &QgsQueryBuilder::btnNotEqual_clicked );
60  connect( btnAnd, &QPushButton::clicked, this, &QgsQueryBuilder::btnAnd_clicked );
61  connect( btnNot, &QPushButton::clicked, this, &QgsQueryBuilder::btnNot_clicked );
62  connect( btnOr, &QPushButton::clicked, this, &QgsQueryBuilder::btnOr_clicked );
63  connect( btnGetAllValues, &QPushButton::clicked, this, &QgsQueryBuilder::btnGetAllValues_clicked );
64  connect( btnSampleValues, &QPushButton::clicked, this, &QgsQueryBuilder::btnSampleValues_clicked );
65  connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsQueryBuilder::showHelp );
66 
67  QPushButton *pbn = new QPushButton( tr( "&Test" ) );
68  buttonBox->addButton( pbn, QDialogButtonBox::ActionRole );
69  connect( pbn, &QAbstractButton::clicked, this, &QgsQueryBuilder::test );
70 
71  pbn = new QPushButton( tr( "&Clear" ) );
72  buttonBox->addButton( pbn, QDialogButtonBox::ActionRole );
73  connect( pbn, &QAbstractButton::clicked, this, &QgsQueryBuilder::clear );
74 
75  pbn = new QPushButton( tr( "&Save…" ) );
76  buttonBox->addButton( pbn, QDialogButtonBox::ActionRole );
77  pbn->setToolTip( tr( "Save query to QQF file" ) );
78  connect( pbn, &QAbstractButton::clicked, this, &QgsQueryBuilder::saveQuery );
79 
80  pbn = new QPushButton( tr( "&Load…" ) );
81  buttonBox->addButton( pbn, QDialogButtonBox::ActionRole );
82  pbn->setToolTip( tr( "Load query from QQF file" ) );
83  connect( pbn, &QAbstractButton::clicked, this, &QgsQueryBuilder::loadQuery );
84 
85  setupGuiViews();
86 
87  mOrigSubsetString = layer->subsetString();
88 
89  mUseUnfilteredLayer->setDisabled( mLayer->subsetString().isEmpty() );
90 
91  lblDataUri->setText( tr( "Set provider filter on %1" ).arg( layer->name() ) );
92  txtSQL->setText( mOrigSubsetString );
93 
94  mFilterLineEdit->setShowSearchIcon( true );
95  mFilterLineEdit->setPlaceholderText( tr( "Search…" ) );
96  connect( mFilterLineEdit, &QgsFilterLineEdit::textChanged, this, &QgsQueryBuilder::onTextChanged );
97 
98  populateFields();
99 }
100 
101 void QgsQueryBuilder::showEvent( QShowEvent *event )
102 {
103  txtSQL->setFocus();
104  QDialog::showEvent( event );
105 }
106 
107 void QgsQueryBuilder::populateFields()
108 {
109  const QgsFields &fields = mLayer->fields();
110  txtSQL->setFields( fields );
111  for ( int idx = 0; idx < fields.count(); ++idx )
112  {
113  if ( fields.fieldOrigin( idx ) != QgsFields::OriginProvider )
114  {
115  // only consider native fields
116  continue;
117  }
118  QStandardItem *myItem = new QStandardItem( fields.at( idx ).displayNameWithAlias() );
119  myItem->setData( idx );
120  myItem->setEditable( false );
121  mModelFields->insertRow( mModelFields->rowCount(), myItem );
122  }
123 
124  // All fields get ... setup
125  setupLstFieldsModel();
126 }
127 
128 void QgsQueryBuilder::setupLstFieldsModel()
129 {
130  lstFields->setModel( mModelFields );
131 }
132 
133 void QgsQueryBuilder::setupGuiViews()
134 {
135  //Initialize the models
136  mModelFields = new QStandardItemModel();
137  mModelValues = new QStandardItemModel();
138  mProxyValues = new QSortFilterProxyModel();
139  mProxyValues->setSourceModel( mModelValues );
140  // Modes
141  lstFields->setViewMode( QListView::ListMode );
142  lstValues->setViewMode( QListView::ListMode );
143  lstFields->setSelectionBehavior( QAbstractItemView::SelectRows );
144  lstValues->setSelectionBehavior( QAbstractItemView::SelectRows );
145  // Performance tip since Qt 4.1
146  lstFields->setUniformItemSizes( true );
147  lstValues->setUniformItemSizes( true );
148  // Colored rows
149  lstFields->setAlternatingRowColors( true );
150  lstValues->setAlternatingRowColors( true );
151  lstValues->setModel( mProxyValues );
152 }
153 
154 void QgsQueryBuilder::fillValues( int idx, int limit )
155 {
156  // clear the model
157  mModelValues->clear();
158 
159  // determine the field type
160  QList<QVariant> values = qgis::setToList( mLayer->uniqueValues( idx, limit ) );
161  std::sort( values.begin(), values.end() );
162 
163  QString nullValue = QgsApplication::nullRepresentation();
164 
165  QgsDebugMsg( QStringLiteral( "nullValue: %1" ).arg( nullValue ) );
166 
167  const auto constValues = values;
168  for ( const QVariant &var : constValues )
169  {
170  QString value;
171  if ( var.isNull() )
172  value = nullValue;
173  else if ( var.type() == QVariant::Date && mLayer->providerType() == QLatin1String( "ogr" ) && mLayer->storageType() == QLatin1String( "ESRI Shapefile" ) )
174  value = var.toDate().toString( QStringLiteral( "yyyy/MM/dd" ) );
175  else
176  value = var.toString();
177 
178  QStandardItem *myItem = new QStandardItem( value );
179  myItem->setEditable( false );
180  myItem->setData( var, Qt::UserRole + 1 );
181  mModelValues->insertRow( mModelValues->rowCount(), myItem );
182  QgsDebugMsg( QStringLiteral( "Value is null: %1\nvalue: %2" ).arg( var.isNull() ).arg( var.isNull() ? nullValue : var.toString() ) );
183  }
184 }
185 
186 void QgsQueryBuilder::btnSampleValues_clicked()
187 {
188  lstValues->setCursor( Qt::WaitCursor );
189 
190  QString prevSubsetString = mLayer->subsetString();
191  if ( mUseUnfilteredLayer->isChecked() && !prevSubsetString.isEmpty() )
192  {
193  mLayer->setSubsetString( QString() );
194  }
195 
196  //Clear and fill the mModelValues
197  fillValues( mModelFields->data( lstFields->currentIndex(), Qt::UserRole + 1 ).toInt(), 25 );
198 
199  if ( prevSubsetString != mLayer->subsetString() )
200  {
201  mLayer->setSubsetString( prevSubsetString );
202  }
203 
204  lstValues->setCursor( Qt::ArrowCursor );
205 }
206 
207 void QgsQueryBuilder::btnGetAllValues_clicked()
208 {
209  lstValues->setCursor( Qt::WaitCursor );
210 
211  QString prevSubsetString = mLayer->subsetString();
212  if ( mUseUnfilteredLayer->isChecked() && !prevSubsetString.isEmpty() )
213  {
214  mLayer->setSubsetString( QString() );
215  }
216 
217  //Clear and fill the mModelValues
218  fillValues( mModelFields->data( lstFields->currentIndex(), Qt::UserRole + 1 ).toInt(), -1 );
219 
220  if ( prevSubsetString != mLayer->subsetString() )
221  {
222  mLayer->setSubsetString( prevSubsetString );
223  }
224 
225  lstValues->setCursor( Qt::ArrowCursor );
226 }
227 
229 {
230  // test the sql statement to see if it works
231  // by counting the number of records that would be
232  // returned
233 
234  if ( mLayer->setSubsetString( txtSQL->text() ) )
235  {
236  mUseUnfilteredLayer->setDisabled( mLayer->subsetString().isEmpty() );
237 
238  const long featureCount { mLayer->featureCount() };
239  // Check for errors
240  if ( featureCount < 0 )
241  {
242  QMessageBox::warning( this,
243  tr( "Query Result" ),
244  tr( "An error occurred when executing the query, please check the expression syntax." ) );
245  }
246  else
247  {
248  QMessageBox::information( this,
249  tr( "Query Result" ),
250  tr( "The where clause returned %n row(s).", "returned test rows", featureCount ) );
251  }
252  }
253  else if ( mLayer->dataProvider()->hasErrors() )
254  {
255  QMessageBox::warning( this,
256  tr( "Query Result" ),
257  tr( "An error occurred when executing the query." )
258  + tr( "\nThe data provider said:\n%1" ).arg( mLayer->dataProvider()->errors().join( QLatin1Char( '\n' ) ) ) );
259  mLayer->dataProvider()->clearErrors();
260  }
261  else
262  {
263  QMessageBox::warning( this,
264  tr( "Query Result" ),
265  tr( "An error occurred when executing the query." ) );
266  }
267 }
268 
270 {
271  if ( txtSQL->text() != mOrigSubsetString )
272  {
273  if ( !mLayer->setSubsetString( txtSQL->text() ) )
274  {
275  //error in query - show the problem
276  if ( mLayer->dataProvider()->hasErrors() )
277  {
278  QMessageBox::warning( this,
279  tr( "Query Result" ),
280  tr( "An error occurred when executing the query." )
281  + tr( "\nThe data provider said:\n%1" ).arg( mLayer->dataProvider()->errors().join( QLatin1Char( '\n' ) ) ) );
282  mLayer->dataProvider()->clearErrors();
283  }
284  else
285  {
286  QMessageBox::warning( this, tr( "Query Result" ), tr( "Error in query. The subset string could not be set." ) );
287  }
288 
289  return;
290  }
291  }
292 
293  QDialog::accept();
294 }
295 
297 {
298  if ( mLayer->subsetString() != mOrigSubsetString )
299  mLayer->setSubsetString( mOrigSubsetString );
300 
301  QDialog::reject();
302 }
303 
304 void QgsQueryBuilder::btnEqual_clicked()
305 {
306  txtSQL->insertText( QStringLiteral( " = " ) );
307  txtSQL->setFocus();
308 }
309 
310 void QgsQueryBuilder::btnLessThan_clicked()
311 {
312  txtSQL->insertText( QStringLiteral( " < " ) );
313  txtSQL->setFocus();
314 }
315 
316 void QgsQueryBuilder::btnGreaterThan_clicked()
317 {
318  txtSQL->insertText( QStringLiteral( " > " ) );
319  txtSQL->setFocus();
320 }
321 
322 void QgsQueryBuilder::btnPct_clicked()
323 {
324  txtSQL->insertText( QStringLiteral( "%" ) );
325  txtSQL->setFocus();
326 }
327 
328 void QgsQueryBuilder::btnIn_clicked()
329 {
330  txtSQL->insertText( QStringLiteral( " IN " ) );
331  txtSQL->setFocus();
332 }
333 
334 void QgsQueryBuilder::btnNotIn_clicked()
335 {
336  txtSQL->insertText( QStringLiteral( " NOT IN " ) );
337  txtSQL->setFocus();
338 }
339 
340 void QgsQueryBuilder::btnLike_clicked()
341 {
342  txtSQL->insertText( QStringLiteral( " LIKE " ) );
343  txtSQL->setFocus();
344 }
345 
347 {
348  return txtSQL->text();
349 }
350 
351 void QgsQueryBuilder::setSql( const QString &sqlStatement )
352 {
353  txtSQL->setText( sqlStatement );
354 }
355 
356 void QgsQueryBuilder::lstFields_clicked( const QModelIndex &index )
357 {
358  if ( mPreviousFieldRow != index.row() )
359  {
360  mPreviousFieldRow = index.row();
361 
362  btnSampleValues->setEnabled( true );
363  btnGetAllValues->setEnabled( true );
364 
365  mModelValues->clear();
366  mFilterLineEdit->clear();
367  }
368 }
369 
370 void QgsQueryBuilder::lstFields_doubleClicked( const QModelIndex &index )
371 {
372  txtSQL->insertText( '\"' + mLayer->fields().at( mModelFields->data( index, Qt::UserRole + 1 ).toInt() ).name() + '\"' );
373  txtSQL->setFocus();
374 }
375 
376 void QgsQueryBuilder::lstValues_doubleClicked( const QModelIndex &index )
377 {
378  QVariant value = index.data( Qt::UserRole + 1 );
379  if ( value.isNull() )
380  txtSQL->insertText( QStringLiteral( "NULL" ) );
381  else if ( value.type() == QVariant::Date && mLayer->providerType() == QLatin1String( "ogr" ) && mLayer->storageType() == QLatin1String( "ESRI Shapefile" ) )
382  txtSQL->insertText( '\'' + value.toDate().toString( QStringLiteral( "yyyy/MM/dd" ) ) + '\'' );
383  else if ( value.type() == QVariant::Int || value.type() == QVariant::Double || value.type() == QVariant::LongLong || value.type() == QVariant::Bool )
384  txtSQL->insertText( value.toString() );
385  else
386  txtSQL->insertText( '\'' + value.toString().replace( '\'', QLatin1String( "''" ) ) + '\'' );
387 
388  txtSQL->setFocus();
389 }
390 
391 void QgsQueryBuilder::btnLessEqual_clicked()
392 {
393  txtSQL->insertText( QStringLiteral( " <= " ) );
394  txtSQL->setFocus();
395 }
396 
397 void QgsQueryBuilder::btnGreaterEqual_clicked()
398 {
399  txtSQL->insertText( QStringLiteral( " >= " ) );
400  txtSQL->setFocus();
401 }
402 
403 void QgsQueryBuilder::btnNotEqual_clicked()
404 {
405  txtSQL->insertText( QStringLiteral( " != " ) );
406  txtSQL->setFocus();
407 }
408 
409 void QgsQueryBuilder::btnAnd_clicked()
410 {
411  txtSQL->insertText( QStringLiteral( " AND " ) );
412  txtSQL->setFocus();
413 }
414 
415 void QgsQueryBuilder::btnNot_clicked()
416 {
417  txtSQL->insertText( QStringLiteral( " NOT " ) );
418  txtSQL->setFocus();
419 }
420 
421 void QgsQueryBuilder::btnOr_clicked()
422 {
423  txtSQL->insertText( QStringLiteral( " OR " ) );
424  txtSQL->setFocus();
425 }
426 
427 void QgsQueryBuilder::onTextChanged( const QString &text )
428 {
429  mProxyValues->setFilterCaseSensitivity( Qt::CaseInsensitive );
430  mProxyValues->setFilterWildcard( text );
431 }
432 
434 {
435  txtSQL->clear();
436  mLayer->setSubsetString( QString() );
437  mUseUnfilteredLayer->setDisabled( true );
438 }
439 
440 void QgsQueryBuilder::btnILike_clicked()
441 {
442  txtSQL->insertText( QStringLiteral( " ILIKE " ) );
443  txtSQL->setFocus();
444 }
445 
447 {
448  lblDataUri->setText( uri );
449 }
450 
451 void QgsQueryBuilder::showHelp()
452 {
453  QgsHelp::openHelp( QStringLiteral( "working_with_vector/vector_properties.html#query-builder" ) );
454 }
455 
457 {
458  QgsSettings s;
459  QString lastQueryFileDir = s.value( QStringLiteral( "/UI/lastQueryFileDir" ), QDir::homePath() ).toString();
460  //save as qqf (QGIS query file)
461  QString saveFileName = QFileDialog::getSaveFileName( nullptr, tr( "Save Query to File" ), lastQueryFileDir, tr( "Query files (*.qqf *.QQF)" ) );
462  if ( saveFileName.isNull() )
463  {
464  return;
465  }
466 
467  if ( !saveFileName.endsWith( QLatin1String( ".qqf" ), Qt::CaseInsensitive ) )
468  {
469  saveFileName += QLatin1String( ".qqf" );
470  }
471 
472  QFile saveFile( saveFileName );
473  if ( !saveFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
474  {
475  QMessageBox::critical( nullptr, tr( "Save Query to File" ), tr( "Could not open file for writing." ) );
476  return;
477  }
478 
479  QDomDocument xmlDoc;
480  QDomElement queryElem = xmlDoc.createElement( QStringLiteral( "Query" ) );
481  QDomText queryTextNode = xmlDoc.createTextNode( txtSQL->text() );
482  queryElem.appendChild( queryTextNode );
483  xmlDoc.appendChild( queryElem );
484 
485  QTextStream fileStream( &saveFile );
486  xmlDoc.save( fileStream, 2 );
487 
488  QFileInfo fi( saveFile );
489  s.setValue( QStringLiteral( "/UI/lastQueryFileDir" ), fi.absolutePath() );
490 }
491 
493 {
494  QgsSettings s;
495  QString lastQueryFileDir = s.value( QStringLiteral( "/UI/lastQueryFileDir" ), QDir::homePath() ).toString();
496 
497  QString queryFileName = QFileDialog::getOpenFileName( nullptr, tr( "Load Query from File" ), lastQueryFileDir, tr( "Query files" ) + " (*.qqf);;" + tr( "All files" ) + " (*)" );
498  if ( queryFileName.isNull() )
499  {
500  return;
501  }
502 
503  QFile queryFile( queryFileName );
504  if ( !queryFile.open( QIODevice::ReadOnly ) )
505  {
506  QMessageBox::critical( nullptr, tr( "Load Query from File" ), tr( "Could not open file for reading." ) );
507  return;
508  }
509  QDomDocument queryDoc;
510  if ( !queryDoc.setContent( &queryFile ) )
511  {
512  QMessageBox::critical( nullptr, tr( "Load Query from File" ), tr( "File is not a valid xml document." ) );
513  return;
514  }
515 
516  QDomElement queryElem = queryDoc.firstChildElement( QStringLiteral( "Query" ) );
517  if ( queryElem.isNull() )
518  {
519  QMessageBox::critical( nullptr, tr( "Load Query from File" ), tr( "File is not a valid query document." ) );
520  return;
521  }
522 
523  QString query = queryElem.text();
524 
525  //TODO: test if all the attributes are valid
526  QgsExpression search( query );
527  if ( search.hasParserError() )
528  {
529  QMessageBox::critical( this, tr( "Query Result" ), search.parserErrorString() );
530  return;
531  }
532 
533  txtSQL->clear();
534  txtSQL->insertText( query );
535 }
QgsFields::OriginProvider
@ OriginProvider
Field comes from the underlying data provider of the vector layer (originIndex = index in provider's ...
Definition: qgsfields.h:51
QgsVectorDataProvider::hasErrors
bool hasErrors() const
Provider has errors to report.
Definition: qgsvectordataprovider.cpp:720
QgsSettings::value
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Definition: qgssettings.cpp:174
qgsgui.h
QgsField::displayNameWithAlias
QString displayNameWithAlias() const
Returns the name to use when displaying this field and adds the alias in parenthesis if it is defined...
Definition: qgsfield.cpp:96
QgsFields::count
int count() const
Returns number of items.
Definition: qgsfields.cpp:133
QgsFields
Container of fields for a vector layer.
Definition: qgsfields.h:45
QgsSettings
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QgsDebugMsg
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
QgsVectorLayer::featureCount
long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
Definition: qgsvectorlayer.cpp:751
QgsQueryBuilder::accept
void accept() override
Definition: qgsquerybuilder.cpp:269
QgsField::name
QString name
Definition: qgsfield.h:59
QgsQueryBuilder::showEvent
void showEvent(QShowEvent *event) override
Definition: qgsquerybuilder.cpp:101
qgsquerybuilder.h
QgsMapLayer::providerType
QString providerType() const
Returns the provider type (provider key) for this layer.
Definition: qgsmaplayer.cpp:1617
qgsapplication.h
QgsGui::enableAutoGeometryRestore
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
Definition: qgsgui.cpp:139
QgsVectorLayer::fields
QgsFields fields() const FINAL
Returns the list of fields of this layer.
Definition: qgsvectorlayer.cpp:3283
QgsVectorDataProvider::errors
QStringList errors() const
Gets recorded errors.
Definition: qgsvectordataprovider.cpp:725
QgsQueryBuilder::saveQuery
void saveQuery()
Save query to the XML file.
Definition: qgsquerybuilder.cpp:456
QgsExpression::parserErrorString
QString parserErrorString() const
Returns parser error.
Definition: qgsexpression.cpp:207
QgsApplication::nullRepresentation
static QString nullRepresentation()
This string is used to represent the value NULL throughout QGIS.
Definition: qgsapplication.cpp:1851
QgsQueryBuilder::loadQuery
void loadQuery()
Load query from the XML file.
Definition: qgsquerybuilder.cpp:492
QgsVectorLayer::uniqueValues
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const FINAL
Calculates a list of unique values contained within an attribute in the layer.
Definition: qgsvectorlayer.cpp:3968
QgsQueryBuilder::reject
void reject() override
Definition: qgsquerybuilder.cpp:296
QgsFields::fieldOrigin
FieldOrigin fieldOrigin(int fieldIdx) const
Gets field's origin (value from an enumeration)
Definition: qgsfields.cpp:189
qgsvectordataprovider.h
QgsSettings::setValue
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
Definition: qgssettings.cpp:289
QgsQueryBuilder::QgsQueryBuilder
QgsQueryBuilder(QgsVectorLayer *layer, QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
This constructor is used when the query builder is called from the vector layer properties dialog.
Definition: qgsquerybuilder.cpp:38
QgsVectorDataProvider::clearErrors
void clearErrors()
Clear recorded errors.
Definition: qgsvectordataprovider.cpp:715
qgsvectorlayer.h
QgsQueryBuilder::test
void test()
Test the constructed sql statement to see if the vector layer data provider likes it.
Definition: qgsquerybuilder.cpp:228
QgsGui::instance
static QgsGui * instance()
Returns a pointer to the singleton instance.
Definition: qgsgui.cpp:63
QgsHelp::openHelp
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition: qgshelp.cpp:36
QgsVectorLayer
Represents a vector layer which manages a vector based data sets.
Definition: qgsvectorlayer.h:387
qgssettings.h
QgsMapLayer::name
QString name
Definition: qgsmaplayer.h:86
QgsVectorLayer::dataProvider
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
Definition: qgsvectorlayer.cpp:627
QgsQueryBuilder::sql
QString sql()
Definition: qgsquerybuilder.cpp:346
QgsVectorLayer::storageType
QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
Definition: qgsvectorlayer.cpp:340
QgsVectorLayer::subsetString
QString subsetString
Definition: qgsvectorlayer.h:390
QgsExpression::hasParserError
bool hasParserError() const
Returns true if an error occurred when parsing the input expression.
Definition: qgsexpression.cpp:202
QgsQueryBuilder::setDatasourceDescription
void setDatasourceDescription(const QString &uri)
Definition: qgsquerybuilder.cpp:446
qgslogger.h
QgsFields::at
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
Definition: qgsfields.cpp:163
QgsQueryBuilder::clear
void clear()
Definition: qgsquerybuilder.cpp:433
QgsExpression
Class for parsing and evaluation of expressions (formerly called "search strings").
Definition: qgsexpression.h:105
QgsQueryBuilder::setSql
void setSql(const QString &sqlStatement)
Definition: qgsquerybuilder.cpp:351
qgshelp.h
qgsproject.h
QgsVectorLayer::setSubsetString
virtual bool setSubsetString(const QString &subset)
Sets the string (typically sql) used to define a subset of the layer.
Definition: qgsvectorlayer.cpp:943