QGIS API Documentation 4.3.0-Master (9ff14a2eeba)
Loading...
Searching...
No Matches
qgslayerpropertiesdialog.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslayerpropertiesdialog.cpp
3 --------------------------------------
4 Date : June 2023
5 Copyright : (C) 2023 by 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 "qgsfileutils.h"
19#include "qgsmapcanvas.h"
20#include "qgsmaplayer.h"
26#include "qgsmetadatawidget.h"
27#include "qgsnative.h"
28#include "qgsproviderregistry.h"
29#include "qgssettings.h"
30#include "qgssldexportcontext.h"
31
32#include <QDesktopServices>
33#include <QDir>
34#include <QFileDialog>
35#include <QMessageBox>
36#include <QPushButton>
37#include <QString>
38#include <qstackedwidget.h>
39
40#include "moc_qgslayerpropertiesdialog.cpp"
41
42using namespace Qt::StringLiterals;
43
44QgsLayerPropertiesDialog::QgsLayerPropertiesDialog( QgsMapLayer *layer, QgsMapCanvas *canvas, const QString &settingsKey, QWidget *parent, Qt::WindowFlags fl, QgsSettings *settings )
45 : QgsOptionsDialogBase( settingsKey, parent, fl, settings )
46 , mCanvas( canvas )
47 , mLayer( layer )
48{}
49
51{
52 mMetadataWidget = widget;
53 mMetadataPage = page;
54}
55
57{
58 if ( !mLayer || !mMetadataWidget )
59 return;
60
61 QgsSettings settings; // where we keep last used filter in persistent state
62 const QString lastUsedDir = settings.value( u"style/lastStyleDir"_s, QDir::homePath() ).toString();
63
64 const QString fileName = QFileDialog::getOpenFileName( this, tr( "Load Layer Metadata" ), lastUsedDir, tr( "QGIS Layer Metadata File" ) + " (*.qmd)" );
65 if ( fileName.isNull() )
66 {
67 return;
68 }
69
70 bool defaultLoadedFlag = false;
71 const QString message = mLayer->loadNamedMetadata( fileName, defaultLoadedFlag );
72
73 //reset if the default style was loaded OK only
74 if ( defaultLoadedFlag )
75 {
76 mMetadataWidget->setMetadata( &mLayer->metadata() );
77 }
78 else
79 {
80 //let the user know what went wrong
81 QMessageBox::warning( this, tr( "Load Metadata" ), message );
82 }
83
84 settings.setValue( u"style/lastStyleDir"_s, QFileInfo( fileName ).path() );
85
87}
88
90{
91 if ( !mLayer || !mMetadataWidget )
92 return;
93
94 QgsSettings settings; // where we keep last used filter in persistent state
95 const QString lastUsedDir = settings.value( u"style/lastStyleDir"_s, QDir::homePath() ).toString();
96
97 QString outputFileName = QFileDialog::getSaveFileName( this, tr( "Save Layer Metadata as QMD" ), lastUsedDir, tr( "QMD File" ) + " (*.qmd)" );
98 // return dialog focus on Mac
99 activateWindow();
100 raise();
101 if ( outputFileName.isEmpty() )
102 {
103 return;
104 }
105
106 mMetadataWidget->acceptMetadata();
107
108 //ensure the user never omitted the extension from the file name
109 if ( !outputFileName.endsWith( QgsMapLayer::extensionPropertyType( QgsMapLayer::Metadata ), Qt::CaseInsensitive ) )
110 {
112 }
113
114 bool defaultLoadedFlag = false;
115 const QString message = mLayer->saveNamedMetadata( outputFileName, defaultLoadedFlag );
116 if ( defaultLoadedFlag )
117 settings.setValue( u"style/lastStyleDir"_s, QFileInfo( outputFileName ).absolutePath() );
118 else
119 QMessageBox::information( this, tr( "Save Metadata" ), message );
120
122}
123
125{
126 if ( !mLayer || !mMetadataWidget )
127 return;
128
129 mMetadataWidget->acceptMetadata();
130
131 bool defaultSavedFlag = false;
132 const QString infoWindowTitle = QObject::tr( "Save Default Metadata" );
133 const QString errorMsg = mLayer->saveDefaultMetadata( defaultSavedFlag );
134 if ( !defaultSavedFlag )
135 {
136 QMessageBox::warning( this, infoWindowTitle, errorMsg );
138 }
139 else
140 {
141 QMessageBox::information( this, infoWindowTitle, tr( "Metadata saved." ) );
142 }
143}
144
146{
147 if ( !mLayer || !mMetadataWidget )
148 return;
149
150 bool defaultLoadedFlag = false;
151 const QString message = mLayer->loadNamedMetadata( mLayer->metadataUri(), defaultLoadedFlag );
152 //reset if the default metadata was loaded OK only
153 if ( defaultLoadedFlag )
154 {
155 mMetadataWidget->setMetadata( &mLayer->metadata() );
156 }
157 else
158 {
159 QMessageBox::information( this, tr( "Default Metadata" ), message );
161 }
162}
163
165{
166 if ( !mLayer )
167 return;
168
169 QgsSettings settings;
170 const QString lastUsedDir = settings.value( u"style/lastStyleDir"_s, QDir::homePath() ).toString();
171
172 QString fileName = QFileDialog::getOpenFileName( this, tr( "Load layer properties from style file" ), lastUsedDir, tr( "QGIS Layer Style File" ) + " (*.qml)" );
173 if ( fileName.isEmpty() )
174 return;
175
176 // ensure the user never omits the extension from the file name
177 if ( !fileName.endsWith( ".qml"_L1, Qt::CaseInsensitive ) )
178 fileName += ".qml"_L1;
179
181
182 bool defaultLoadedFlag = false;
183 const QString message = mLayer->loadNamedStyle( fileName, defaultLoadedFlag );
184 if ( defaultLoadedFlag )
185 {
186 settings.setValue( u"style/lastStyleDir"_s, QFileInfo( fileName ).absolutePath() );
187 syncToLayer();
188 }
189 else
190 {
191 QMessageBox::information( this, tr( "Load Style" ), message );
193 }
194}
195
197{
198 if ( !mLayer )
199 return;
200
201 QgsSettings settings;
202 const QString lastUsedDir = settings.value( u"style/lastStyleDir"_s, QDir::homePath() ).toString();
203
204 QString outputFileName = QFileDialog::getSaveFileName( this, tr( "Save layer properties as style file" ), lastUsedDir, tr( "QGIS Layer Style File" ) + " (*.qml)" );
205 // return dialog focus on Mac
206 activateWindow();
207 raise();
208 if ( outputFileName.isEmpty() )
209 return;
210
211 // ensure the user never omits the extension from the file name
212 outputFileName = QgsFileUtils::ensureFileNameHasExtension( outputFileName, QStringList() << u"qml"_s );
213
214 apply(); // make sure the style to save is up-to-date
215
216 // then export style
217 bool defaultLoadedFlag = false;
218 const QString message = mLayer->saveNamedStyle( outputFileName, defaultLoadedFlag );
219
220 if ( defaultLoadedFlag )
221 {
222 settings.setValue( u"style/lastStyleDir"_s, QFileInfo( outputFileName ).absolutePath() );
223 }
224 else
225 {
226 QMessageBox::information( this, tr( "Save Style" ), message );
228 }
229}
230
232{
233 if ( !mLayer )
234 return;
235
236 apply(); // make sure the style to save is up-to-date
237
238 // a flag passed by reference
239 bool defaultSavedFlag = false;
240 // TODO Once the deprecated `saveDefaultStyle()` method is gone, just
241 // remove the NOWARN_DEPRECATED tags
243 // after calling this the above flag will be set true for success
244 // or false if the save operation failed
245 const QString message = mLayer->saveDefaultStyle( defaultSavedFlag );
247 if ( !defaultSavedFlag )
248 {
249 // let the user know what went wrong
250 QMessageBox::information( this, tr( "Default Style" ), message );
252 }
253}
254
256{
257 restoreOptionsBaseUi( generateDialogTitle() );
258}
259
261{
262 activateWindow(); // set focus back to properties dialog
263}
264
266{
267 if ( !factory->supportsLayer( mLayer ) || !factory->supportLayerPropertiesDialog() )
268 {
269 return;
270 }
271
272 QgsMapLayerConfigWidget *page = factory->createWidget( mLayer, mCanvas, false, this );
273 mConfigWidgets << page;
274
275 const QString beforePage = factory->layerPropertiesPagePositionHint();
276 if ( beforePage.isEmpty() )
277 addPage( factory->title(), factory->title(), factory->icon(), page );
278 else
279 insertPage( factory->title(), factory->title(), factory->icon(), page, beforePage );
280
281 page->syncToLayer( mLayer );
282}
283
285{
286 QString msg;
287 bool defaultLoadedFlag = false;
288
289 const QgsDataProvider *provider = mLayer->dataProvider();
290 if ( !provider )
291 return;
293 {
294 QMessageBox askToUser;
295 askToUser.setText( tr( "Load default style from: " ) );
296 askToUser.setIcon( QMessageBox::Question );
297 askToUser.addButton( tr( "Cancel" ), QMessageBox::RejectRole );
298 askToUser.addButton( tr( "Local Database" ), QMessageBox::NoRole );
299 askToUser.addButton( tr( "Datasource Database" ), QMessageBox::YesRole );
300
301 switch ( askToUser.exec() )
302 {
303 case 0:
304 return;
305 case 2:
306 msg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag, false );
307 if ( !defaultLoadedFlag )
308 {
309 //something went wrong - let them know why
310 QMessageBox::information( this, tr( "Default Style" ), msg );
311 }
312 if ( msg.compare( tr( "Loaded from Provider" ) ) )
313 {
314 QMessageBox::information( this, tr( "Default Style" ), tr( "No default style was found for this layer." ) );
315 }
316 else
317 {
318 syncToLayer();
319 apply();
320 }
321
322 return;
323 default:
324 break;
325 }
326 }
327
328 QString myMessage = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag, true );
329 // QString myMessage = layer->loadDefaultStyle( defaultLoadedFlag );
330 //reset if the default style was loaded OK only
331 if ( defaultLoadedFlag )
332 {
333 // all worked OK so no need to inform user
334 syncToLayer();
335 apply();
336 }
337 else
338 {
339 //something went wrong - let them know why
340 QMessageBox::information( this, tr( "Default Style" ), myMessage );
341 }
342}
343
345{
346 QString errorMsg;
347 const QgsDataProvider *provider = mLayer->dataProvider();
348 if ( !provider )
349 return;
351 {
352 QMessageBox askToUser;
353 askToUser.setText( tr( "Save default style to: " ) );
354 askToUser.setIcon( QMessageBox::Question );
355 QPushButton *cancelButton = askToUser.addButton( tr( "Cancel" ), QMessageBox::RejectRole );
356 askToUser.addButton( tr( "Local Database" ), QMessageBox::NoRole );
357 QPushButton *datasourceButton = askToUser.addButton( tr( "Datasource Database" ), QMessageBox::YesRole );
358
359 askToUser.exec();
360
361 if ( askToUser.clickedButton() == cancelButton )
362 {
363 return;
364 }
365 else if ( askToUser.clickedButton() == datasourceButton )
366 {
367 apply();
368 QString errorMessage;
369 if ( QgsProviderRegistry::instance()->styleExists( mLayer->providerType(), mLayer->source(), QString(), errorMessage ) )
370 {
371 if ( QMessageBox::
372 question( nullptr, QObject::tr( "Save style in database" ), QObject::tr( "A matching style already exists in the database for this layer. Do you want to overwrite it?" ), QMessageBox::Yes | QMessageBox::No )
373 == QMessageBox::No )
374 {
375 return;
376 }
377 }
378 else if ( !errorMessage.isEmpty() )
379 {
380 QMessageBox::warning( nullptr, QObject::tr( "Save style in database" ), errorMessage );
381 return;
382 }
383
384 mLayer->saveStyleToDatabaseV2( QString(), QString(), true, QString(), errorMsg );
385 if ( errorMsg.isNull() )
386 {
387 return;
388 }
389 }
390 }
391
393}
394
396{
397 if ( !mLayer->dataProvider() )
398 return;
399 QgsMapLayerSaveStyleDialog dlg( mLayer );
400
401 if ( dlg.exec() )
402 {
403 apply();
404
405 bool defaultLoadedFlag = false;
406 QString errorMessage;
407
408 StyleType type = dlg.currentStyleType();
409 switch ( type )
410 {
411 case QML:
412 case SLD:
413 {
414 QString filePath = dlg.outputFilePath();
415 if ( type == QML )
416 errorMessage = mLayer->saveNamedStyle( filePath, defaultLoadedFlag, dlg.styleCategories() );
417 else
418 {
420 errorMessage = mLayer->saveSldStyleV2( defaultLoadedFlag, sldContext );
421 }
422
423 //reset if the default style was loaded OK only
424 if ( defaultLoadedFlag )
425 {
426 syncToLayer();
427 }
428 else
429 {
430 //let the user know what went wrong
431 QMessageBox::information( this, tr( "Save Style" ), errorMessage );
432 }
433
434 break;
435 }
437 {
438 QString infoWindowTitle = QObject::tr( "Save style to DB (%1)" ).arg( mLayer->providerType() );
439
441
442 if ( QgsProviderRegistry::instance()->styleExists( mLayer->providerType(), mLayer->source(), dbSettings.name, errorMessage ) )
443 {
444 if ( QMessageBox::
445 question( nullptr, QObject::tr( "Save style in database" ), QObject::tr( "A matching style already exists in the database for this layer. Do you want to overwrite it?" ), QMessageBox::Yes | QMessageBox::No )
446 == QMessageBox::No )
447 {
448 return;
449 }
450 }
451 else if ( !errorMessage.isEmpty() )
452 {
453 QMessageBox::warning( this, infoWindowTitle, errorMessage );
454 return;
455 }
456
457 mLayer->saveStyleToDatabaseV2( dbSettings.name, dbSettings.description, dbSettings.isDefault, dbSettings.uiFileContent, errorMessage, dlg.styleCategories() );
458
459 if ( !errorMessage.isNull() )
460 {
461 QMessageBox::warning( this, infoWindowTitle, errorMessage );
462 }
463 else
464 {
465 QMessageBox::information( this, infoWindowTitle, tr( "Style saved" ) );
466 }
467 break;
468 }
469 case UserDatabase:
470 {
471 QString infoWindowTitle = tr( "Save default style to local database" );
472 errorMessage = mLayer->saveDefaultStyle( defaultLoadedFlag, dlg.styleCategories() );
473 if ( !defaultLoadedFlag )
474 {
475 QMessageBox::warning( this, infoWindowTitle, errorMessage );
476 }
477 else
478 {
479 QMessageBox::information( this, infoWindowTitle, tr( "Style saved" ) );
480 }
481 break;
482 }
483 }
484 }
485}
486
488{
489 QString errorMsg;
490 QStringList ids, names, descriptions;
491
492 //get the list of styles in the db
493 int sectionLimit = mLayer->listStylesInDatabase( ids, names, descriptions, errorMsg );
494 QgsMapLayerLoadStyleDialog dlg( mLayer, this );
495 dlg.initializeLists( ids, names, descriptions, sectionLimit );
496
497 if ( dlg.exec() )
498 {
499 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
501 StyleType type = dlg.currentStyleType();
502 bool defaultLoadedFlag = false;
503 switch ( type )
504 {
505 case QML:
506 case SLD:
507 {
508 QString filePath = dlg.filePath();
509 if ( type == SLD )
510 {
511 errorMsg = mLayer->loadSldStyle( filePath, defaultLoadedFlag );
512 }
513 else
514 {
515 errorMsg = mLayer->loadNamedStyle( filePath, defaultLoadedFlag, true, categories );
516 }
517 //reset if the default style was loaded OK only
518 if ( defaultLoadedFlag )
519 {
520 syncToLayer();
521 apply();
522 }
523 else
524 {
525 //let the user know what went wrong
526 QMessageBox::warning( this, tr( "Load Style" ), errorMsg );
527 }
528 break;
529 }
531 {
532 QString selectedStyleId = dlg.selectedStyleId();
533
534 QString qmlStyle = mLayer->getStyleFromDatabase( selectedStyleId, errorMsg );
535 if ( !errorMsg.isNull() )
536 {
537 QMessageBox::warning( this, tr( "Load Styles from Database" ), errorMsg );
538 return;
539 }
540
541 QDomDocument myDocument( u"qgis"_s );
542 myDocument.setContent( qmlStyle );
543
544 if ( mLayer->importNamedStyle( myDocument, errorMsg, categories ) )
545 {
546 syncToLayer();
547 apply();
548 }
549 else
550 {
551 QMessageBox::warning( this, tr( "Load Styles from Database" ), tr( "The retrieved style is not a valid named style. Error message: %1" ).arg( errorMsg ) );
552 }
553 break;
554 }
555 case UserDatabase:
556 {
557 errorMsg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag, true, categories );
558 //reset if the default style was loaded OK only
559 if ( defaultLoadedFlag )
560 {
561 syncToLayer();
562 apply();
563 }
564 else
565 {
566 QMessageBox::warning( this, tr( "Load Default Style" ), errorMsg );
567 }
568 break;
569 }
570 }
571 activateWindow(); // set focus back to properties dialog
572 }
573}
574
576{
577 if ( !mLayer )
578 return;
579
580 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
581}
582
583QString QgsLayerPropertiesDialog::generateDialogTitle() const
584{
585 QString title = tr( "Layer Properties - %1" ).arg( mLayer->name() );
586
587 if ( !mLayer->styleManager()->isDefault( mLayer->styleManager()->currentStyle() ) )
588 title += u" (%1)"_s.arg( mLayer->styleManager()->currentStyle() );
589
590 return title;
591}
592
594{
595 if ( mOldStyle.xmlData() != mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() ).xmlData() )
596 {
597 // need to reset style to previous - style applied directly to the layer (not in apply())
598 QString message;
599 QDomDocument doc( u"qgis"_s );
600 int errorLine, errorColumn;
601 doc.setContent( mOldStyle.xmlData(), false, &message, &errorLine, &errorColumn );
602 mLayer->importNamedStyle( doc, message );
603 syncToLayer();
604 }
605}
606
608{
610
611 if ( mMetadataPage && mBtnStyle && mBtnMetadata )
612 {
613 const bool isMetadataPanel = ( index == mOptStackedWidget->indexOf( mMetadataPage ) );
614 mBtnStyle->setVisible( !isMetadataPanel );
615 mBtnMetadata->setVisible( isMetadataPanel );
616 }
617}
618
620{
621 QFileInfo file( url.toLocalFile() );
622 if ( file.exists() && !file.isDir() )
623 QgsGui::nativePlatformInterface()->openFileExplorerAndSelectFile( url.toLocalFile() );
624 else
625 QDesktopServices::openUrl( url );
626}
@ NoVendorExtension
No vendor extensions.
Definition qgis.h:753
Abstract base class for spatial data provider implementations.
virtual Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const
Returns the style storage capabilities.
static QString ensureFileNameHasExtension(const QString &fileName, const QStringList &extensions)
Ensures that a fileName ends with an extension from the provided list of extensions.
static QgsNative * nativePlatformInterface()
Returns the global native interface, which offers abstraction to the host OS's underlying public inte...
Definition qgsgui.cpp:99
QPushButton * mBtnStyle
Style button.
void saveMetadataToFile()
Allows the user to save the layer's metadata as a file.
virtual void rollback()
Rolls back changes made to the layer.
void optionsStackedWidget_CurrentChanged(int index) override
void saveStyleAsDefault()
Saves the current layer style as the default for the layer.
QList< QgsMapLayerConfigWidget * > mConfigWidgets
Layer config widgets.
void setMetadataWidget(QgsMetadataWidget *widget, QWidget *page)
Sets the metadata widget and page associated with the dialog.
void loadDefaultStyle()
Reloads the default style for the layer.
void saveStyleAs()
Saves a style when appriate button is pressed.
virtual void apply()=0
Applies the dialog settings to the layer.
virtual void syncToLayer()=0
Resets the dialog to the current layer state.
void loadStyle()
Triggers a dialog to load a saved style.
void saveStyleToFile()
Allows the user to save the layer's style to a file.
QgsMapCanvas * mCanvas
Associated map canvas.
void loadDefaultMetadata()
Reloads the default layer metadata for the layer.
void refocusDialog()
Ensures the dialog is focused and activated.
QgsLayerPropertiesDialog(QgsMapLayer *layer, QgsMapCanvas *canvas, const QString &settingsKey, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), QgsSettings *settings=nullptr)
Constructor for QgsLayerPropertiesDialog.
void storeCurrentStyleForUndo()
Stores the current layer style so that undo operations can be performed.
QgsMapLayerStyle mOldStyle
Previous layer style.
void loadMetadataFromFile()
Allows the user to load layer metadata from a file.
void saveDefaultStyle()
Saves the default style when appropriate button is pressed.
virtual void addPropertiesPageFactory(const QgsMapLayerConfigWidgetFactory *factory)
Adds properties page from a factory.
void loadStyleFromFile()
Allows the user to load layer style from a file.
QPushButton * mBtnMetadata
Metadata button.
void initialize()
Initialize the dialog.
void saveMetadataAsDefault()
Saves the current layer metadata as the default for the layer.
void openUrl(const QUrl &url)
Handles opening a url from the dialog.
Map canvas is a class for displaying all GIS data types on a canvas.
Factory class for creating custom map layer property pages.
virtual bool supportsLayer(QgsMapLayer *layer) const
Check if the layer is supported for this widget.
virtual QIcon icon() const
The icon that will be shown in the UI for the panel.
virtual QgsMapLayerConfigWidget * createWidget(QgsMapLayer *layer, QgsMapCanvas *canvas, bool dockWidget=true, QWidget *parent=nullptr) const =0
Factory function to create the widget on demand as needed by the dock.
virtual QString title() const
The title of the panel.
virtual bool supportLayerPropertiesDialog() const
Flag if widget is supported for use in layer properties dialog.
virtual QString layerPropertiesPagePositionHint() const
Returns a tab name hinting at where this page should be inserted into the layer properties tab list.
A panel widget that can be shown in the map style dock.
virtual void syncToLayer(QgsMapLayer *layer)
Reset to original (vector layer) values.
A reusable dialog which allows users to select stored layer styles and categories to load for a map l...
QgsMapLayer::StyleCategories styleCategories() const
Returns the list of selected style categories the user has opted to load.
void initializeLists(const QStringList &ids, const QStringList &names, const QStringList &descriptions, int sectionLimit)
Initialize list of database stored styles.
QString selectedStyleId()
Returns the ID of the selected database stored style.
QString filePath() const
Returns the full path to the selected layer style source file.
QgsLayerPropertiesDialog::StyleType currentStyleType() const
Returns the selected style type.
A dialog which allows saving map layer styles.
QString outputFilePath() const
Returns the selected file output path.
Qgis::SldExportOptions sldExportOptions() const
Returns the SLD export options.
SaveToDbSettings saveToDbSettings() const
Returns the database settings for saving the style in the DB.
QgsMapLayer::StyleCategories styleCategories() const
Returns the available style categories.
QgsLayerPropertiesDialog::StyleType currentStyleType() const
Returns the selected style storage type.
Base class for all map layer types.
Definition qgsmaplayer.h:83
QFlags< StyleCategory > StyleCategories
static QString extensionPropertyType(PropertyType type)
Returns the extension of a Property.
A wizard to edit metadata on a map layer.
virtual void optionsStackedWidget_CurrentChanged(int index)
Select relevant tab on current page change.
QgsOptionsDialogBase(const QString &settingsKey, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), QgsSettings *settings=nullptr)
Constructor.
void addPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QStringList &path=QStringList(), const QString &key=QString())
Adds a new page to the dialog pages.
void restoreOptionsBaseUi(const QString &title=QString())
Restore the base ui.
QStackedWidget * mOptStackedWidget
void insertPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QString &before, const QStringList &path=QStringList(), const QString &key=QString())
Inserts a new page into the dialog pages.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Stores settings for use within QGIS.
Definition qgssettings.h:68
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.
Holds SLD export options and other information related to SLD export of a QGIS layer style.
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:7999
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:7998