From 44ed7bd9fb9bcf4f4cc747fb5ebed0142a28a5fb Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Tue, 28 Nov 2017 22:04:43 -0400 Subject: [PATCH] define default transforms in global options adds QgsCoordinateTransformContext::readSettings()/writeSettings to read/write from settings --- python/core/qgscoordinatetransformcontext.sip | 14 ++ src/app/qgsoptions.cpp | 163 +++++++----------- src/app/qgsoptions.h | 17 +- src/app/qgsprojectproperties.cpp | 1 - src/core/qgscoordinatetransformcontext.cpp | 94 ++++++++++ src/core/qgscoordinatetransformcontext.h | 14 ++ src/core/qgscoordinatetransformcontext_p.h | 4 + src/ui/qgsoptionsbase.ui | 51 ++---- src/ui/qgsprojectpropertiesbase.ui | 63 ++++--- 9 files changed, 247 insertions(+), 174 deletions(-) diff --git a/python/core/qgscoordinatetransformcontext.sip b/python/core/qgscoordinatetransformcontext.sip index 8883c7d55f4..13ae426e985 100644 --- a/python/core/qgscoordinatetransformcontext.sip +++ b/python/core/qgscoordinatetransformcontext.sip @@ -12,6 +12,7 @@ + class QgsCoordinateTransformContext { %Docstring @@ -149,6 +150,19 @@ class QgsCoordinateTransformContext %End + void readSettings(); +%Docstring + Reads the context's state from application settings. +.. seealso:: readSettings() +%End + + void writeSettings(); +%Docstring + Write the context's state to application settings. +.. seealso:: writeSettings() +%End + + }; diff --git a/src/app/qgsoptions.cpp b/src/app/qgsoptions.cpp index 73658d82c34..391114f4cc2 100644 --- a/src/app/qgsoptions.cpp +++ b/src/app/qgsoptions.cpp @@ -38,6 +38,7 @@ #include "qgsattributetablefiltermodel.h" #include "qgsrasterformatsaveoptionswidget.h" #include "qgsrasterpyramidsoptionswidget.h" +#include "qgsdatumtransformdialog.h" #include "qgsdialog.h" #include "qgscomposer.h" #include "qgscolorschemeregistry.h" @@ -454,56 +455,21 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QListsetCrs( mDefaultCrs ); leProjectGlobalCrs->setOptionVisible( QgsProjectionSelectionWidget::DefaultCrs, false ); - //default datum transformations - mSettings->beginGroup( QStringLiteral( "/Projections" ) ); - mShowDatumTransformDialogCheckBox->setChecked( mSettings->value( QStringLiteral( "/Projections/showDatumTransformDialog" ), false ).toBool() ); - QStringList projectionKeys = mSettings->allKeys(); + // Datum transforms + QgsCoordinateTransformContext context; + context.readSettings(); + mDefaultDatumTransformTableModel->setTransformContext( context ); + mDefaultDatumTransformTableView->setModel( mDefaultDatumTransformTableModel ); + mDefaultDatumTransformTableView->resizeColumnToContents( 0 ); + mDefaultDatumTransformTableView->horizontalHeader()->show(); + mDefaultDatumTransformTableView->setSelectionMode( QAbstractItemView::SingleSelection ); + mDefaultDatumTransformTableView->setSelectionBehavior( QAbstractItemView::SelectRows ); + connect( mAddDefaultTransformButton, &QToolButton::clicked, this, &QgsOptions::addDefaultDatumTransform ); + connect( mRemoveDefaultTransformButton, &QToolButton::clicked, this, &QgsOptions::removeDefaultDatumTransform ); + connect( mEditDefaultTransformButton, &QToolButton::clicked, this, &QgsOptions::editDefaultDatumTransform ); - //collect src and dest entries that belong together - QMap< QPair< QString, QString >, QPair< int, int > > transforms; - QStringList::const_iterator pkeyIt = projectionKeys.constBegin(); - for ( ; pkeyIt != projectionKeys.constEnd(); ++pkeyIt ) - { - if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) || pkeyIt->contains( QLatin1String( "destTransform" ) ) ) - { - QStringList split = pkeyIt->split( '/' ); - QString srcAuthId, destAuthId; - if ( ! split.isEmpty() ) - { - srcAuthId = split.at( 0 ); - } - if ( split.size() > 1 ) - { - destAuthId = split.at( 1 ).split( '_' ).at( 0 ); - } - - if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) ) - { - transforms[ qMakePair( srcAuthId, destAuthId )].first = mSettings->value( *pkeyIt ).toInt(); - } - else if ( pkeyIt->contains( QLatin1String( "destTransform" ) ) ) - { - transforms[ qMakePair( srcAuthId, destAuthId )].second = mSettings->value( *pkeyIt ).toInt(); - } - } - } - mSettings->endGroup(); - - QMap< QPair< QString, QString >, QPair< int, int > >::const_iterator transformIt = transforms.constBegin(); - for ( ; transformIt != transforms.constEnd(); ++transformIt ) - { - const QPair< int, int > &v = transformIt.value(); - QTreeWidgetItem *item = new QTreeWidgetItem(); - item->setText( 0, transformIt.key().first ); - item->setText( 1, transformIt.key().second ); - item->setText( 2, QString::number( v.first ) ); - item->setText( 3, QString::number( v.second ) ); - mDefaultDatumTransformTreeWidget->addTopLevelItem( item ); - } - connect( mAddDefaultTransformButton, &QAbstractButton::clicked, this, &QgsOptions::addDefaultTransformation ); - connect( mRemoveDefaultTransformButton, &QAbstractButton::clicked, this, &QgsOptions::removeDefaultTransformation ); // Set the units for measuring mDistanceUnitsComboBox->addItem( tr( "Meters" ), QgsUnitTypes::DistanceMeters ); @@ -1560,7 +1526,7 @@ void QgsOptions::saveOptions() mStyleSheetBuilder->saveToSettings( mStyleSheetNewOpts ); } - saveDefaultDatumTransformations(); + mDefaultDatumTransformTableModel->transformContext().writeSettings(); mLocatorOptionsWidget->commitChanges(); @@ -2255,72 +2221,71 @@ void QgsOptions::saveMinMaxLimits( QComboBox *cbox, const QString &name ) mSettings->setValue( "/Raster/defaultContrastEnhancementLimits/" + name, value ); } -void QgsOptions::removeDefaultTransformation() +void QgsOptions::addDefaultDatumTransform() { - QList items = mDefaultDatumTransformTreeWidget->selectedItems(); - for ( int i = 0; i < items.size(); ++i ) + QgsDatumTransformDialog *dlg = new QgsDatumTransformDialog(); + if ( dlg->exec() ) { - int idx = mDefaultDatumTransformTreeWidget->indexOfTopLevelItem( items.at( i ) ); - if ( idx >= 0 ) - { - delete mDefaultDatumTransformTreeWidget->takeTopLevelItem( idx ); - } + QPair< QPair, QPair > dt = dlg->selectedDatumTransforms(); + QgsCoordinateTransformContext context = mDefaultDatumTransformTableModel->transformContext(); + context.addSourceDestinationDatumTransform( dt.first.first, dt.second.first, dt.first.second, dt.second.second ); + mDefaultDatumTransformTableModel->setTransformContext( context ); } } -void QgsOptions::addDefaultTransformation() +void QgsOptions::removeDefaultDatumTransform() { - QTreeWidgetItem *item = new QTreeWidgetItem(); - item->setText( 0, QLatin1String( "" ) ); - item->setText( 1, QLatin1String( "" ) ); - item->setText( 2, QLatin1String( "" ) ); - item->setText( 3, QLatin1String( "" ) ); - item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable ); - mDefaultDatumTransformTreeWidget->addTopLevelItem( item ); + QModelIndexList selectedIndexes = mDefaultDatumTransformTableView->selectionModel()->selectedIndexes(); + if ( selectedIndexes.count() > 0 ) + { + mDefaultDatumTransformTableModel->removeTransform( selectedIndexes ); + } } -void QgsOptions::saveDefaultDatumTransformations() +void QgsOptions::editDefaultDatumTransform() { - QgsSettings s; - s.beginGroup( QStringLiteral( "/Projections" ) ); - QStringList groupKeys = s.allKeys(); - QStringList::const_iterator groupKeyIt = groupKeys.constBegin(); - for ( ; groupKeyIt != groupKeys.constEnd(); ++groupKeyIt ) + QModelIndexList selectedIndexes = mDefaultDatumTransformTableView->selectionModel()->selectedIndexes(); + if ( selectedIndexes.count() > 0 ) { - if ( groupKeyIt->contains( QLatin1String( "srcTransform" ) ) || groupKeyIt->contains( QLatin1String( "destTransform" ) ) ) + QgsCoordinateReferenceSystem sourceCrs; + QgsCoordinateReferenceSystem destinationCrs; + int sourceTransform = -1; + int destinationTransform = -1; + for ( QModelIndexList::const_iterator it = selectedIndexes.constBegin(); it != selectedIndexes.constEnd(); it ++ ) { - s.remove( *groupKeyIt ); + if ( it->column() == QgsDatumTransformTableModel::SourceCrsColumn ) + { + sourceCrs = QgsCoordinateReferenceSystem( mDefaultDatumTransformTableModel->data( *it, Qt::DisplayRole ).toString() ); + } + if ( it->column() == QgsDatumTransformTableModel::DestinationCrsColumn ) + { + destinationCrs = QgsCoordinateReferenceSystem( mDefaultDatumTransformTableModel->data( *it, Qt::DisplayRole ).toString() ); + } + if ( it->column() == QgsDatumTransformTableModel::SourceTransformColumn ) + { + sourceTransform = mDefaultDatumTransformTableModel->data( *it, Qt::UserRole ).toInt(); + } + if ( it->column() == QgsDatumTransformTableModel::DestinationTransformColumn ) + { + destinationTransform = mDefaultDatumTransformTableModel->data( *it, Qt::UserRole ).toInt(); + } + } + if ( sourceCrs.isValid() && destinationCrs.isValid() && + ( sourceTransform != -1 || destinationTransform != -1 ) ) + { + QgsDatumTransformDialog *dlg = new QgsDatumTransformDialog( sourceCrs, destinationCrs, qMakePair( sourceTransform, destinationTransform ) ); + if ( dlg->exec() ) + { + QPair< QPair, QPair > dt = dlg->selectedDatumTransforms(); + QgsCoordinateTransformContext context = mDefaultDatumTransformTableModel->transformContext(); + // QMap::insert takes care of replacing existing value + context.addSourceDestinationDatumTransform( sourceCrs, destinationCrs, dt.first.second, dt.second.second ); + mDefaultDatumTransformTableModel->setTransformContext( context ); + } } } - - int nDefaultTransforms = mDefaultDatumTransformTreeWidget->topLevelItemCount(); - for ( int i = 0; i < nDefaultTransforms; ++i ) - { - QTreeWidgetItem *item = mDefaultDatumTransformTreeWidget->topLevelItem( i ); - QString srcAuthId = item->text( 0 ); - QString destAuthId = item->text( 1 ); - if ( srcAuthId.isEmpty() || destAuthId.isEmpty() ) - { - continue; - } - - bool conversionOk; - int srcDatumTransform = item->text( 2 ).toInt( &conversionOk ); - if ( conversionOk ) - { - s.setValue( srcAuthId + "//" + destAuthId + "_srcTransform", srcDatumTransform ); - } - int destDatumTransform = item->text( 3 ).toInt( &conversionOk ); - if ( conversionOk ) - { - s.setValue( srcAuthId + "//" + destAuthId + "_destTransform", destDatumTransform ); - } - } - - s.endGroup(); } - void QgsOptions::addColor() { QColor newColor = QgsColorDialog::getColor( QColor(), this->parentWidget(), tr( "Select color" ), true ); diff --git a/src/app/qgsoptions.h b/src/app/qgsoptions.h index c92c9d18952..5a630448393 100644 --- a/src/app/qgsoptions.h +++ b/src/app/qgsoptions.h @@ -25,6 +25,7 @@ #include "qgshelp.h" #include "qgscoordinatereferencesystem.h" +#include "qgsdatumtransformtablemodel.h" #include #include "qgis_app.h" @@ -227,11 +228,17 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption /* Save the list of which gdal drivers should be used. */ void saveGdalDriverList(); - void removeDefaultTransformation(); - void addDefaultTransformation(); - void addColor(); + //! add a new datum transform + void addDefaultDatumTransform(); + + //! remove currently selected datum transform + void removeDefaultDatumTransform(); + + //! edit currently selected datum transform + void editDefaultDatumTransform(); + private: QgsSettings *mSettings = nullptr; QStringList i18nList(); @@ -248,8 +255,6 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption //! Generate table row for custom environment variables void addCustomEnvVarRow( const QString &varName, const QString &varVal, const QString &varApply = QString() ); - void saveDefaultDatumTransformations(); - void showHelp(); QListWidgetItem *addScaleToScaleList( const QString &newScale ); @@ -267,7 +272,7 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption QList< QgsOptionsPageWidget * > mAdditionalOptionWidgets; QgsLocatorOptionsWidget *mLocatorOptionsWidget = nullptr; - + QgsDatumTransformTableModel *mDefaultDatumTransformTableModel = new QgsDatumTransformTableModel( this ); }; #endif // #ifndef QGSOPTIONS_H diff --git a/src/app/qgsprojectproperties.cpp b/src/app/qgsprojectproperties.cpp index 31f8e38e1d8..d60e1141858 100644 --- a/src/app/qgsprojectproperties.cpp +++ b/src/app/qgsprojectproperties.cpp @@ -1297,7 +1297,6 @@ void QgsProjectProperties::editDatumTransform() } } } - } void QgsProjectProperties::cbxWFSPubliedStateChanged( int aIdx ) diff --git a/src/core/qgscoordinatetransformcontext.cpp b/src/core/qgscoordinatetransformcontext.cpp index af74e21a5df..a82c5b135dd 100644 --- a/src/core/qgscoordinatetransformcontext.cpp +++ b/src/core/qgscoordinatetransformcontext.cpp @@ -17,6 +17,8 @@ #include "qgscoordinatetransformcontext.h" #include "qgscoordinatetransformcontext_p.h" +#include "qgssettings.h" + QgsCoordinateTransformContext::QgsCoordinateTransformContext() : d( new QgsCoordinateTransformContextPrivate() ) {} @@ -37,8 +39,10 @@ void QgsCoordinateTransformContext::clear() // play it safe d->mLock.lockForWrite(); d->mSourceDestDatumTransforms.clear(); +#if 0 d->mSourceDatumTransforms.clear(); d->mDestDatumTransforms.clear(); +#endif d->mLock.unlock(); } @@ -163,8 +167,10 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q d->mLock.lockForWrite(); d->mSourceDestDatumTransforms.clear(); +#if 0 d->mSourceDatumTransforms.clear(); d->mDestDatumTransforms.clear(); +#endif const QDomNodeList contextNodes = element.elementsByTagName( QStringLiteral( "transformContext" ) ); if ( contextNodes.count() < 1 ) @@ -192,6 +198,7 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q } } +#if 0 // src transforms const QDomNodeList srcNodes = contextElem.elementsByTagName( QStringLiteral( "source" ) ); for ( int i = 0; i < srcNodes .size(); ++i ) @@ -219,6 +226,7 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q d->mDestDatumTransforms.insert( key, value ); } } +#endif d->mLock.unlock(); } @@ -240,6 +248,7 @@ void QgsCoordinateTransformContext::writeXml( QDomElement &element, QDomDocument contextElem.appendChild( transformElem ); } +#if 0 // src transforms for ( auto it = d->mSourceDatumTransforms.constBegin(); it != d->mSourceDatumTransforms.constEnd(); ++ it ) { @@ -257,7 +266,92 @@ void QgsCoordinateTransformContext::writeXml( QDomElement &element, QDomDocument transformElem.setAttribute( QStringLiteral( "transform" ), it.value() ); contextElem.appendChild( transformElem ); } +#endif element.appendChild( contextElem ); d->mLock.unlock(); } + +void QgsCoordinateTransformContext::readSettings() +{ + d.detach(); + d->mLock.lockForWrite(); + + d->mSourceDestDatumTransforms.clear(); +#if 0 + d->mSourceDatumTransforms.clear(); + d->mDestDatumTransforms.clear(); +#endif + + QgsSettings *settings = new QgsSettings(); + settings->beginGroup( QStringLiteral( "/Projections" ) ); + QStringList projectionKeys = settings->allKeys(); + + //collect src and dest entries that belong together + QMap< QPair< QString, QString >, QPair< int, int > > transforms; + QStringList::const_iterator pkeyIt = projectionKeys.constBegin(); + for ( ; pkeyIt != projectionKeys.constEnd(); ++pkeyIt ) + { + if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) || pkeyIt->contains( QLatin1String( "destTransform" ) ) ) + { + QStringList split = pkeyIt->split( '/' ); + QString srcAuthId, destAuthId; + if ( ! split.isEmpty() ) + { + srcAuthId = split.at( 0 ); + } + if ( split.size() > 1 ) + { + destAuthId = split.at( 1 ).split( '_' ).at( 0 ); + } + + if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) ) + { + transforms[ qMakePair( srcAuthId, destAuthId )].first = settings->value( *pkeyIt ).toInt(); + } + else if ( pkeyIt->contains( QLatin1String( "destTransform" ) ) ) + { + transforms[ qMakePair( srcAuthId, destAuthId )].second = settings->value( *pkeyIt ).toInt(); + } + } + } + + // add transforms to context + QMap< QPair< QString, QString >, QPair< int, int > >::const_iterator transformIt = transforms.constBegin(); + for ( ; transformIt != transforms.constEnd(); ++transformIt ) + { + d->mSourceDestDatumTransforms.insert( transformIt.key(), transformIt.value() ); + } + + d->mLock.unlock(); + settings->endGroup(); +} + +void QgsCoordinateTransformContext::writeSettings() +{ + QgsSettings s; + s.beginGroup( QStringLiteral( "/Projections" ) ); + QStringList groupKeys = s.allKeys(); + QStringList::const_iterator groupKeyIt = groupKeys.constBegin(); + for ( ; groupKeyIt != groupKeys.constEnd(); ++groupKeyIt ) + { + if ( groupKeyIt->contains( QLatin1String( "srcTransform" ) ) || groupKeyIt->contains( QLatin1String( "destTransform" ) ) ) + { + s.remove( *groupKeyIt ); + } + } + + QMap< QPair< QString, QString >, QPair< int, int > >::const_iterator transformIt = d->mSourceDestDatumTransforms.constBegin(); + for ( ; transformIt != d->mSourceDestDatumTransforms.constEnd(); ++transformIt ) + { + QString srcAuthId = transformIt.key().first; + QString destAuthId = transformIt.key().second; + int sourceDatumTransform = transformIt.value().first; + int destinationDatumTransform = transformIt.value().second; + + s.setValue( srcAuthId + "//" + destAuthId + "_srcTransform", sourceDatumTransform ); + s.setValue( srcAuthId + "//" + destAuthId + "_destTransform", destinationDatumTransform ); + } + + s.endGroup(); +} diff --git a/src/core/qgscoordinatetransformcontext.h b/src/core/qgscoordinatetransformcontext.h index 99b284c037a..16e738f9d38 100644 --- a/src/core/qgscoordinatetransformcontext.h +++ b/src/core/qgscoordinatetransformcontext.h @@ -24,6 +24,7 @@ class QgsReadWriteContext; + /*************************************************************************** * This class is considered CRITICAL and any change MUST be accompanied with * full unit tests in testqgsfeature.cpp. @@ -242,6 +243,19 @@ class CORE_EXPORT QgsCoordinateTransformContext void writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const; + /** + * Reads the context's state from application settings. + * \see readSettings() + */ + void readSettings(); + + /** + * Write the context's state to application settings. + * \see writeSettings() + */ + void writeSettings(); + + private: QExplicitlySharedDataPointer d; diff --git a/src/core/qgscoordinatetransformcontext_p.h b/src/core/qgscoordinatetransformcontext_p.h index 609218c6968..6a0a4a92b1e 100644 --- a/src/core/qgscoordinatetransformcontext_p.h +++ b/src/core/qgscoordinatetransformcontext_p.h @@ -50,8 +50,10 @@ class QgsCoordinateTransformContextPrivate : public QSharedData { other.mLock.lockForRead(); mSourceDestDatumTransforms = other.mSourceDestDatumTransforms; +#if 0 mSourceDatumTransforms = other.mSourceDatumTransforms; mDestDatumTransforms = other.mDestDatumTransforms; +#endif other.mLock.unlock(); } @@ -61,11 +63,13 @@ class QgsCoordinateTransformContextPrivate : public QSharedData */ QMap< QPair< QString, QString >, QPair< int, int > > mSourceDestDatumTransforms; +#if 0 //! Mapping for datum transforms to use for source CRS QMap< QString, int > mSourceDatumTransforms; //! Mapping for datum transforms to use for destination CRS QMap< QString, int > mDestDatumTransforms; +#endif //! Mutex for making QgsCoordinateTransformContextPrivate thread safe mutable QReadWriteLock mLock; diff --git a/src/ui/qgsoptionsbase.ui b/src/ui/qgsoptionsbase.ui index a832d1935b0..4bf80c31b40 100644 --- a/src/ui/qgsoptionsbase.ui +++ b/src/ui/qgsoptionsbase.ui @@ -337,8 +337,8 @@ 0 0 - 848 - 812 + 577 + 766 @@ -1032,7 +1032,7 @@ 0 0 - 848 + 545 1114 @@ -1568,8 +1568,8 @@ 0 0 - 848 - 812 + 540 + 705 @@ -1936,7 +1936,7 @@ 0 0 - 848 + 717 1020 @@ -2687,8 +2687,8 @@ 0 0 - 848 - 812 + 140 + 276 @@ -2838,8 +2838,8 @@ 0 0 - 848 - 812 + 532 + 236 @@ -4679,30 +4679,6 @@ The bigger the number, the faster zooming with the mouse wheel will be. - - - - - Source CRS - - - - - Destination CRS - - - - - Source datum transform - - - - - Destination datum transform - - - - @@ -4710,6 +4686,9 @@ The bigger the number, the faster zooming with the mouse wheel will be. + + + @@ -4796,8 +4775,8 @@ The bigger the number, the faster zooming with the mouse wheel will be. 0 0 - 848 - 812 + 641 + 764 diff --git a/src/ui/qgsprojectpropertiesbase.ui b/src/ui/qgsprojectpropertiesbase.ui index 9608f67f4e7..c519a181dc7 100644 --- a/src/ui/qgsprojectpropertiesbase.ui +++ b/src/ui/qgsprojectpropertiesbase.ui @@ -259,8 +259,8 @@ 0 0 - 676 - 764 + 565 + 697 @@ -797,8 +797,7 @@ - - + @@ -831,9 +830,6 @@ - - - @@ -868,8 +864,10 @@ + + + - cbxProjectionEnabled mDatumTransformTableView mDatumTransformAddButton mDatumTransformRemoveButton @@ -910,8 +908,8 @@ 0 0 - 676 - 764 + 133 + 100 @@ -996,8 +994,8 @@ 0 0 - 676 - 764 + 269 + 597 @@ -1434,7 +1432,7 @@ 0 0 - 676 + 598 2363 @@ -2535,8 +2533,8 @@ 0 0 - 676 - 764 + 156 + 59 @@ -2689,47 +2687,47 @@ - - QgsCollapsibleGroupBox - QGroupBox -
qgscollapsiblegroupbox.h
- 1 -
- - QgsFilterLineEdit - QLineEdit -
qgsfilterlineedit.h
-
QgsScrollArea QScrollArea
qgsscrollarea.h
1
+ + QgsCollapsibleGroupBox + QGroupBox +
qgscollapsiblegroupbox.h
+ 1 +
QgsColorButton QToolButton
qgscolorbutton.h
1
- - QgsOpacityWidget - QWidget -
qgsopacitywidget.h
- 1 -
QgsVariableEditorWidget QWidget
qgsvariableeditorwidget.h
1
+ + QgsFilterLineEdit + QLineEdit +
qgsfilterlineedit.h
+
QgsColorSchemeList QWidget
qgscolorschemelist.h
1
+ + QgsOpacityWidget + QWidget +
qgsopacitywidget.h
+ 1 +
QgsCodeEditorPython QWidget @@ -2882,6 +2880,7 @@ +