42#include <ogr_srs_api.h> 
   43#include <gdal_version.h> 
   45#include <cpl_string.h> 
   47#define DEFAULT_OGR_FID_COLUMN_TITLE "fid"  
   50  : QDialog( parent, fl )
 
   53  setObjectName( QStringLiteral( 
"QgsNewGeoPackageLayerDialog" ) );
 
   56  connect( mAddAttributeButton, &QToolButton::clicked, 
this, &QgsNewGeoPackageLayerDialog::mAddAttributeButton_clicked );
 
   57  connect( mRemoveAttributeButton, &QToolButton::clicked, 
this, &QgsNewGeoPackageLayerDialog::mRemoveAttributeButton_clicked );
 
   58  connect( mFieldTypeBox, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsNewGeoPackageLayerDialog::mFieldTypeBox_currentIndexChanged );
 
   59  connect( mGeometryTypeBox, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsNewGeoPackageLayerDialog::mGeometryTypeBox_currentIndexChanged );
 
   60  connect( mTableNameEdit, &QLineEdit::textChanged, 
this, &QgsNewGeoPackageLayerDialog::mTableNameEdit_textChanged );
 
   61  connect( mTableNameEdit, &QLineEdit::textEdited, 
this, &QgsNewGeoPackageLayerDialog::mTableNameEdit_textEdited );
 
   62  connect( mLayerIdentifierEdit, &QLineEdit::textEdited, 
this, &QgsNewGeoPackageLayerDialog::mLayerIdentifierEdit_textEdited );
 
   63  connect( buttonBox, &QDialogButtonBox::accepted, 
this, &QgsNewGeoPackageLayerDialog::buttonBox_accepted );
 
   64  connect( buttonBox, &QDialogButtonBox::rejected, 
this, &QgsNewGeoPackageLayerDialog::buttonBox_rejected );
 
   65  connect( buttonBox, &QDialogButtonBox::helpRequested, 
this, &QgsNewGeoPackageLayerDialog::showHelp );
 
   66  connect( mButtonUp, &QToolButton::clicked, 
this, &QgsNewGeoPackageLayerDialog::moveFieldsUp );
 
   67  connect( mButtonDown, &QToolButton::clicked, 
this, &QgsNewGeoPackageLayerDialog::moveFieldsDown );
 
   72  const auto addGeomItem = [
this]( OGRwkbGeometryType ogrGeomType )
 
   78  addGeomItem( wkbNone );
 
   79  addGeomItem( wkbPoint );
 
   80  addGeomItem( wkbLineString );
 
   81  addGeomItem( wkbPolygon );
 
   82  addGeomItem( wkbMultiPoint );
 
   83  addGeomItem( wkbMultiLineString );
 
   84  addGeomItem( wkbMultiPolygon );
 
   88  addGeomItem( wkbCircularString );
 
   90  addGeomItem( wkbCompoundCurve );
 
   91  addGeomItem( wkbCurvePolygon );
 
   92  addGeomItem( wkbMultiCurve );
 
   93  addGeomItem( wkbMultiSurface );
 
   94  mGeometryTypeBox->setCurrentIndex( -1 );
 
   96  mGeometryWithZCheckBox->setEnabled( 
false );
 
   97  mGeometryWithMCheckBox->setEnabled( 
false );
 
   98  mGeometryColumnEdit->setEnabled( 
false );
 
   99  mGeometryColumnEdit->setText( QStringLiteral( 
"geometry" ) );
 
  101  mCheckBoxCreateSpatialIndex->setEnabled( 
false );
 
  102  mCrsSelector->setEnabled( 
false );
 
  103  mCrsSelector->setShowAccuracyWarnings( 
true );
 
  115  mOkButton = buttonBox->button( QDialogButtonBox::Ok );
 
  116  mOkButton->setEnabled( 
false );
 
  118  connect( mFieldNameEdit, &QLineEdit::textChanged, 
this, &QgsNewGeoPackageLayerDialog::fieldNameChanged );
 
  119  connect( mAttributeView, &QTreeWidget::itemSelectionChanged, 
this, &QgsNewGeoPackageLayerDialog::selectionChanged );
 
  120  connect( mTableNameEdit, &QLineEdit::textChanged, 
this, &QgsNewGeoPackageLayerDialog::checkOk );
 
  121  connect( mGeometryTypeBox, 
static_cast<void( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this,  &QgsNewGeoPackageLayerDialog::checkOk );
 
  123  mAddAttributeButton->setEnabled( 
false );
 
  124  mRemoveAttributeButton->setEnabled( 
false );
 
  125  mButtonUp->setEnabled( 
false );
 
  126  mButtonDown->setEnabled( 
false );
 
  128  mCheckBoxCreateSpatialIndex->setChecked( 
true );
 
  132  mDatabase->setFilter( tr( 
"GeoPackage" ) + 
" (*.gpkg)" );
 
  133  mDatabase->setDialogTitle( tr( 
"Select Existing or Create a New GeoPackage Database File…" ) );
 
  134  mDatabase->setDefaultRoot( settings.
value( QStringLiteral( 
"UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() );
 
  135  mDatabase->setConfirmOverwrite( 
false );
 
  139    const QFileInfo tmplFileInfo( filePath );
 
  140    settings.
setValue( QStringLiteral( 
"UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() );
 
  141    if ( !filePath.isEmpty() && !mTableNameEdited )
 
  143      const QFileInfo fileInfo( filePath );
 
  144      mTableNameEdit->setText( fileInfo.baseName() );
 
  151  QCompleter *completer = 
new QCompleter( 
this );
 
  152  completer->setModel( ogrProviderModel );
 
  154  completer->setCompletionMode( QCompleter::PopupCompletion );
 
  155  completer->setFilterMode( Qt::MatchContains );
 
  156  mDatabase->lineEdit()->setCompleter( completer );
 
 
  161  mCrsSelector->setCrs( 
crs );
 
 
  166  mDatabase->setReadOnly( 
true );
 
 
  169void QgsNewGeoPackageLayerDialog::mFieldTypeBox_currentIndexChanged( 
int )
 
  171  const QString myType = mFieldTypeBox->currentData( Qt::UserRole ).toString();
 
  172  mFieldLengthEdit->setEnabled( myType == QLatin1String( 
"text" ) );
 
  173  if ( myType != QLatin1String( 
"text" ) )
 
  174    mFieldLengthEdit->clear();
 
  178void QgsNewGeoPackageLayerDialog::mGeometryTypeBox_currentIndexChanged( 
int )
 
  180  const OGRwkbGeometryType geomType = 
static_cast<OGRwkbGeometryType
> 
  181                                      ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
 
  182  const bool isSpatial = geomType != wkbNone;
 
  183  mGeometryWithZCheckBox->setEnabled( isSpatial );
 
  184  mGeometryWithMCheckBox->setEnabled( isSpatial );
 
  185  mGeometryColumnEdit->setEnabled( isSpatial );
 
  186  mCheckBoxCreateSpatialIndex->setEnabled( isSpatial );
 
  187  mCrsSelector->setEnabled( isSpatial );
 
  190void QgsNewGeoPackageLayerDialog::mTableNameEdit_textChanged( 
const QString &text )
 
  192  mTableNameEdited = !text.isEmpty();
 
  193  if ( !text.isEmpty() && !mLayerIdentifierEdited )
 
  195    mLayerIdentifierEdit->setText( text );
 
  199void QgsNewGeoPackageLayerDialog::mTableNameEdit_textEdited( 
const QString &text )
 
  202  mTableNameEdited = !text.isEmpty();
 
  205void QgsNewGeoPackageLayerDialog::mLayerIdentifierEdit_textEdited( 
const QString &text )
 
  208  mLayerIdentifierEdited = !text.isEmpty();
 
  211void QgsNewGeoPackageLayerDialog::checkOk()
 
  213  const bool ok = !mDatabase->filePath().isEmpty() &&
 
  214                  !mTableNameEdit->text().isEmpty() &&
 
  215                  mGeometryTypeBox->currentIndex() != -1;
 
  217  mOkButton->setEnabled( ok );
 
  220void QgsNewGeoPackageLayerDialog::mAddAttributeButton_clicked()
 
  222  if ( !mFieldNameEdit->text().isEmpty() )
 
  224    const QString myName = mFieldNameEdit->text();
 
  225    const QString featureId = mFeatureIdColumnEdit->text().isEmpty() ? QStringLiteral( 
DEFAULT_OGR_FID_COLUMN_TITLE ) : mFeatureIdColumnEdit->text();
 
  226    if ( myName.compare( featureId, Qt::CaseInsensitive ) == 0 )
 
  228      QMessageBox::critical( 
this, tr( 
"Add Field" ), tr( 
"The field cannot have the same name as the feature identifier." ) );
 
  233    const QString myType = mFieldTypeBox->currentData( Qt::UserRole ).toString();
 
  234    const QString length = mFieldLengthEdit->text();
 
  235    mAttributeView->addTopLevelItem( 
new QTreeWidgetItem( QStringList() << myName << myType << length ) );
 
  239    mFieldNameEdit->clear();
 
  241    if ( !mFieldNameEdit->hasFocus() )
 
  243      mFieldNameEdit->setFocus();
 
  248void QgsNewGeoPackageLayerDialog::mRemoveAttributeButton_clicked()
 
  250  delete mAttributeView->currentItem();
 
  255void QgsNewGeoPackageLayerDialog::fieldNameChanged( 
const QString &name )
 
  257  mAddAttributeButton->setDisabled( name.isEmpty() || ! mAttributeView->findItems( name, Qt::MatchExactly ).isEmpty() );
 
  260void QgsNewGeoPackageLayerDialog::selectionChanged()
 
  262  mRemoveAttributeButton->setDisabled( mAttributeView->selectedItems().isEmpty() );
 
  263  mButtonUp->setDisabled( mAttributeView->selectedItems().isEmpty() );
 
  264  mButtonDown->setDisabled( mAttributeView->selectedItems().isEmpty() );
 
  267void QgsNewGeoPackageLayerDialog::buttonBox_accepted()
 
  273void QgsNewGeoPackageLayerDialog::buttonBox_rejected()
 
  278void QgsNewGeoPackageLayerDialog::moveFieldsUp()
 
  280  int currentRow = mAttributeView->currentIndex().row();
 
  281  if ( currentRow == 0 )
 
  284  mAttributeView->insertTopLevelItem( currentRow - 1, mAttributeView->takeTopLevelItem( currentRow ) );
 
  285  mAttributeView->setCurrentIndex( mAttributeView->model()->index( currentRow - 1, 0 ) );
 
  288void QgsNewGeoPackageLayerDialog::moveFieldsDown()
 
  290  int currentRow = mAttributeView->currentIndex().row();
 
  291  if ( currentRow == mAttributeView->topLevelItemCount() - 1 )
 
  294  mAttributeView->insertTopLevelItem( currentRow + 1, mAttributeView->takeTopLevelItem( currentRow ) );
 
  295  mAttributeView->setCurrentIndex( mAttributeView->model()->index( currentRow + 1, 0 ) );
 
  298bool QgsNewGeoPackageLayerDialog::apply()
 
  300  if ( !mFieldNameEdit->text().trimmed().isEmpty() )
 
  302    const QString currentFieldName = mFieldNameEdit->text();
 
  303    bool currentFound = 
false;
 
  304    QTreeWidgetItemIterator it( mAttributeView );
 
  307      QTreeWidgetItem *item = *it;
 
  308      if ( item->text( 0 ) == currentFieldName )
 
  318      if ( QMessageBox::question( 
this, windowTitle(),
 
  319                                  tr( 
"The field “%1” has not been added to the fields list. Are you sure you want to proceed and discard this field?" ).arg( currentFieldName ),
 
  320                                  QMessageBox::Ok | QMessageBox::Cancel ) != QMessageBox::Ok )
 
  327  QString fileName( mDatabase->filePath() );
 
  328  if ( !fileName.endsWith( QLatin1String( 
".gpkg" ), Qt::CaseInsensitive ) )
 
  329    fileName += QLatin1String( 
".gpkg" );
 
  331  bool createNewDb = 
false;
 
  333  if ( QFile::exists( fileName ) )
 
  335    bool overwrite = 
false;
 
  342        msgBox.setIcon( QMessageBox::Question );
 
  343        msgBox.setWindowTitle( tr( 
"New GeoPackage Layer" ) );
 
  344        msgBox.setText( tr( 
"The File already exists. Do you want to overwrite the existing file with a new database or add a new layer to it?" ) );
 
  345        QPushButton *overwriteButton = msgBox.addButton( tr( 
"Overwrite" ), QMessageBox::ActionRole );
 
  346        QPushButton *addNewLayerButton = msgBox.addButton( tr( 
"Add New Layer" ), QMessageBox::ActionRole );
 
  347        msgBox.setStandardButtons( QMessageBox::Cancel );
 
  348        msgBox.setDefaultButton( addNewLayerButton );
 
  350        if ( property( 
"hideDialogs" ).toBool() )
 
  352          overwrite = property( 
"question_existing_db_answer_overwrite" ).toBool();
 
  354            cancel = !property( 
"question_existing_db_answer_add_new_layer" ).toBool();
 
  358          const int ret = msgBox.exec();
 
  359          if ( ret == QMessageBox::Cancel )
 
  361          if ( msgBox.clickedButton() == overwriteButton )
 
  382      QFile( fileName ).remove();
 
  391  OGRSFDriverH hGpkgDriver = OGRGetDriverByName( 
"GPKG" );
 
  394    if ( !property( 
"hideDialogs" ).toBool() )
 
  395      QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ),
 
  396                             tr( 
"Layer creation failed. GeoPackage driver not found." ) );
 
  403    hDS.reset( OGR_Dr_CreateDataSource( hGpkgDriver, fileName.toUtf8().constData(), 
nullptr ) );
 
  406      const QString msg( tr( 
"Creation of database failed (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
 
  407      if ( !property( 
"hideDialogs" ).toBool() )
 
  408        QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ), msg );
 
  414    OGRSFDriverH hDriver = 
nullptr;
 
  415    hDS.reset( OGROpen( fileName.toUtf8().constData(), 
true, &hDriver ) );
 
  418      const QString msg( tr( 
"Opening of database failed (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
 
  419      if ( !property( 
"hideDialogs" ).toBool() )
 
  420        QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ), msg );
 
  423    if ( hDriver != hGpkgDriver )
 
  425      const QString msg( tr( 
"Opening of file succeeded, but this is not a GeoPackage database." ) );
 
  426      if ( !property( 
"hideDialogs" ).toBool() )
 
  427        QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ), msg );
 
  432  const QString tableName( mTableNameEdit->text() );
 
  434  bool overwriteTable = 
false;
 
  435  if ( OGR_DS_GetLayerByName( hDS.get(), tableName.toUtf8().constData() ) )
 
  437    if ( property( 
"hideDialogs" ).toBool() )
 
  439      overwriteTable = property( 
"question_existing_layer_answer_overwrite" ).toBool();
 
  441    else if ( QMessageBox::question( 
this, tr( 
"New GeoPackage Layer" ),
 
  442                                     tr( 
"A table with the same name already exists. Do you want to overwrite it?" ),
 
  443                                     QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) == QMessageBox::Yes )
 
  445      overwriteTable = 
true;
 
  448    if ( !overwriteTable )
 
  454  const QString layerIdentifier( mLayerIdentifierEdit->text() );
 
  455  const QString layerDescription( mLayerDescriptionEdit->text() );
 
  457  OGRwkbGeometryType wkbType = 
static_cast<OGRwkbGeometryType
> 
  458                               ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
 
  461  if ( mGeometryWithZCheckBox->isChecked() )
 
  462    wkbType = OGR_GT_SetZ( wkbType );
 
  464  if ( mGeometryWithMCheckBox->isChecked() )
 
  465    wkbType = OGR_GT_SetM( wkbType );
 
  470  if ( wkbType != wkbNone && srs.
isValid() )
 
  476  char **options = 
nullptr;
 
  478  if ( overwriteTable )
 
  479    options = CSLSetNameValue( options, 
"OVERWRITE", 
"YES" );
 
  480  if ( !layerIdentifier.isEmpty() )
 
  481    options = CSLSetNameValue( options, 
"IDENTIFIER", layerIdentifier.toUtf8().constData() );
 
  482  if ( !layerDescription.isEmpty() )
 
  483    options = CSLSetNameValue( options, 
"DESCRIPTION", layerDescription.toUtf8().constData() );
 
  485  const QString featureId( mFeatureIdColumnEdit->text() );
 
  486  if ( !featureId.isEmpty() )
 
  487    options = CSLSetNameValue( options, 
"FID", featureId.toUtf8().constData() );
 
  489  const QString geometryColumn( mGeometryColumnEdit->text() );
 
  490  if ( wkbType != wkbNone && !geometryColumn.isEmpty() )
 
  491    options = CSLSetNameValue( options, 
"GEOMETRY_COLUMN", geometryColumn.toUtf8().constData() );
 
  493  if ( wkbType != wkbNone )
 
  494    options = CSLSetNameValue( options, 
"SPATIAL_INDEX", mCheckBoxCreateSpatialIndex->isChecked() ? 
"YES" : 
"NO" );
 
  496  OGRLayerH hLayer = OGR_DS_CreateLayer( hDS.get(), tableName.toUtf8().constData(), hSRS, wkbType, options );
 
  497  CSLDestroy( options );
 
  502    const QString msg( tr( 
"Creation of layer failed (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
 
  503    if ( !property( 
"hideDialogs" ).toBool() )
 
  504      QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ), msg );
 
  508  QTreeWidgetItemIterator it( mAttributeView );
 
  511    const QString fieldName( ( *it )->text( 0 ) );
 
  512    const QString fieldType( ( *it )->text( 1 ) );
 
  513    const QString fieldWidth( ( *it )->text( 2 ) );
 
  515    OGRFieldType ogrType( OFTString );
 
  516    OGRFieldSubType ogrSubType = OFSTNone;
 
  517    if ( fieldType == QLatin1String( 
"text" ) )
 
  519    else if ( fieldType == QLatin1String( 
"integer" ) )
 
  520      ogrType = OFTInteger;
 
  521    else if ( fieldType == QLatin1String( 
"integer64" ) )
 
  522      ogrType = OFTInteger64;
 
  523    else if ( fieldType == QLatin1String( 
"real" ) )
 
  525    else if ( fieldType == QLatin1String( 
"date" ) )
 
  527    else if ( fieldType == QLatin1String( 
"datetime" ) )
 
  528      ogrType = OFTDateTime;
 
  529    else if ( fieldType == QLatin1String( 
"bool" ) )
 
  531      ogrType = OFTInteger;
 
  532      ogrSubType = OFSTBoolean;
 
  534    else if ( fieldType == QLatin1String( 
"binary" ) )
 
  536    else if ( fieldType == QLatin1String( 
"json" ) )
 
  539      ogrSubType = OFSTJSON;
 
  542    const int ogrWidth = fieldWidth.toInt();
 
  545    if ( ogrSubType != OFSTNone )
 
  546      OGR_Fld_SetSubType( fld.get(), ogrSubType );
 
  548    if ( ogrType != OFTBinary )
 
  549      OGR_Fld_SetWidth( fld.get(), ogrWidth );
 
  551    if ( OGR_L_CreateField( hLayer, fld.get(), 
true ) != OGRERR_NONE )
 
  553      if ( !property( 
"hideDialogs" ).toBool() )
 
  555        QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ),
 
  556                               tr( 
"Creation of field %1 failed (OGR error: %2)" )
 
  557                               .arg( fieldName, QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
 
  568  OGR_L_ResetReading( hLayer );
 
  569  if ( CPLGetLastErrorType() != CE_None )
 
  571    const QString msg( tr( 
"Creation of layer failed (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
 
  572    if ( !property( 
"hideDialogs" ).toBool() )
 
  573      QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ), msg );
 
  578  const QString uri( QStringLiteral( 
"%1|layername=%2" ).arg( fileName, tableName ) );
 
  579  const QString userVisiblelayerName( layerIdentifier.isEmpty() ? tableName : layerIdentifier );
 
  581  std::unique_ptr< QgsVectorLayer > layer = std::make_unique< QgsVectorLayer >( uri, userVisiblelayerName, QStringLiteral( 
"ogr" ), layerOptions );
 
  582  if ( layer->isValid() )
 
  587      QList<QgsMapLayer *> myList;
 
  588      myList << layer.release();
 
  601    if ( !property( 
"hideDialogs" ).toBool() )
 
  602      QMessageBox::critical( 
this, tr( 
"New GeoPackage Layer" ), tr( 
"%1 is an invalid layer and cannot be loaded." ).arg( tableName ) );
 
  610  mBehavior = behavior;
 
 
  615  mAddToProject = addToProject;
 
 
  618void QgsNewGeoPackageLayerDialog::showHelp()
 
  620  QgsHelp::openHelp( QStringLiteral( 
"managing_data_source/create_layers.html#creating-a-new-geopackage-layer" ) );
 
WkbType
The WKB type describes the number of dimensions a geometry has.
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
This class represents a coordinate reference system (CRS).
 
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
 
static QIcon iconForFieldType(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType, const QString &typeString=QString())
Returns an icon corresponding to a field type.
 
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...
 
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
 
static QIcon iconForWkbType(Qgis::WkbType type)
Returns the icon for a vector layer whose geometry type is provided.
 
OverwriteBehavior
Behavior to use when an existing geopackage already exists.
 
@ AddNewLayer
Keep existing contents and add new layer.
 
@ Overwrite
Overwrite whole geopackage.
 
@ Prompt
Prompt user for action.
 
void setAddToProject(bool addToProject)
Sets whether a newly created layer should automatically be added to the current project.
 
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the crs value for the new layer in the dialog.
 
void lockDatabasePath()
Sets the database path widgets to a locked and read-only mode.
 
QgsNewGeoPackageLayerDialog(QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
Constructor.
 
void setOverwriteBehavior(OverwriteBehavior behavior)
Sets the behavior to use when a path to an existing geopackage file is used.
 
static Qgis::WkbType ogrGeometryTypeToQgsWkbType(OGRwkbGeometryType ogrGeomType)
Converts a OGRwkbGeometryType to QgsWkbTypes::Type.
 
static OGRSpatialReferenceH crsToOGRSpatialReference(const QgsCoordinateReferenceSystem &crs)
Returns a OGRSpatialReferenceH corresponding to the specified crs object.
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
QgsCoordinateTransformContext transformContext
 
A model containing registered connection names for a specific data provider.
 
@ Uri
Connection URI string.
 
This class is a composition of two QSettings instances:
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
 
static QString typeToDisplayString(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType)
Returns a user-friendly translated string representing a QVariant type.
 
static QString translatedDisplayString(Qgis::WkbType type)
Returns a translated display string type for a WKB type, e.g., the geometry name used in WKT geometry...
 
std::unique_ptr< std::remove_pointer< OGRDataSourceH >::type, OGRDataSourceDeleter > ogr_datasource_unique_ptr
Scoped OGR data source.
 
std::unique_ptr< std::remove_pointer< OGRFieldDefnH >::type, OGRFldDeleter > ogr_field_def_unique_ptr
Scoped OGR field definition.
 
void * OGRSpatialReferenceH
 
#define DEFAULT_OGR_FID_COLUMN_TITLE
 
const QgsCoordinateReferenceSystem & crs
 
Setting options for loading vector layers.