Move QgsRasterLayerProperties class to the gui API

Motivation :
Move the QgsRasterLayerProperties class to the GUI API.
So, this class could be used using the QGIS API, notably for standalone applications.

The instance of this class was dependent, since QGIS 3.8, from the QgisApp instance, when calling the askUserForDatumTransform(). As this method, defines a title and only call QgsDatumTransformDialog::run() method from the gui API, this PR purpose to :
This commit is contained in:
Vincent Cloarec 2020-01-01 23:02:32 -04:00 committed by Nyall Dawson
parent ef9b8c2c25
commit 30569bce1f
12 changed files with 119 additions and 34 deletions

View File

@ -0,0 +1,48 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/raster/qgsrasterlayerproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
class QgsRasterLayerProperties : QgsOptionsDialogBase
{
%Docstring
Property sheet for a raster map layer
.. versionadded:: 3.12
%End
%TypeHeaderCode
#include "qgsrasterlayerproperties.h"
%End
public:
QgsRasterLayerProperties( QgsMapLayer *lyr, QgsMapCanvas *canvas, QWidget *parent = 0, Qt::WindowFlags = QgsGuiUtils::ModalDialogFlags );
%Docstring
Constructor
:param lyr: Map layer for which properties will be displayed
:param canvas: the QgsMapCanvas instance
:param parent: the parent of this widget
:param fl: windows flag
%End
protected slots:
};
/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/raster/qgsrasterlayerproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/

View File

@ -318,6 +318,7 @@
%Include auto_generated/raster/qgsrendererrasterpropertieswidget.sip %Include auto_generated/raster/qgsrendererrasterpropertieswidget.sip
%Include auto_generated/raster/qgssinglebandgrayrendererwidget.sip %Include auto_generated/raster/qgssinglebandgrayrendererwidget.sip
%Include auto_generated/raster/qgssinglebandpseudocolorrendererwidget.sip %Include auto_generated/raster/qgssinglebandpseudocolorrendererwidget.sip
%Include auto_generated/raster/qgsrasterlayerproperties.sip
%Include auto_generated/symbology/characterwidget.sip %Include auto_generated/symbology/characterwidget.sip
%Include auto_generated/symbology/qgs25drendererwidget.sip %Include auto_generated/symbology/qgs25drendererwidget.sip
%Include auto_generated/symbology/qgsarrowsymbollayerwidget.sip %Include auto_generated/symbology/qgsarrowsymbollayerwidget.sip

View File

@ -66,7 +66,6 @@ SET(QGIS_APP_SRCS
qgsmasksourceselectionwidget.cpp qgsmasksourceselectionwidget.cpp
qgsmapcanvasdockwidget.cpp qgsmapcanvasdockwidget.cpp
qgsmaplayerstylecategoriesmodel.cpp qgsmaplayerstylecategoriesmodel.cpp
qgsmaplayerstyleguiutils.cpp
qgsmapsavedialog.cpp qgsmapsavedialog.cpp
qgsprojectlistitemdelegate.cpp qgsprojectlistitemdelegate.cpp
qgspuzzlewidget.cpp qgspuzzlewidget.cpp
@ -145,7 +144,6 @@ SET(QGIS_APP_SRCS
qgsprojectlayergroupdialog.cpp qgsprojectlayergroupdialog.cpp
qgsprojectproperties.cpp qgsprojectproperties.cpp
qgsrastercalcdialog.cpp qgsrastercalcdialog.cpp
qgsrasterlayerproperties.cpp
qgsrelationmanagerdialog.cpp qgsrelationmanagerdialog.cpp
qgsrelationadddlg.cpp qgsrelationadddlg.cpp
qgsselectbyformdialog.cpp qgsselectbyformdialog.cpp

View File

@ -4,6 +4,7 @@ SET(QGIS_GUI_SRCS
raster/qgspalettedrendererwidget.cpp raster/qgspalettedrendererwidget.cpp
raster/qgsrasterbandcombobox.cpp raster/qgsrasterbandcombobox.cpp
raster/qgsrasterhistogramwidget.cpp raster/qgsrasterhistogramwidget.cpp
raster/qgsrasterlayerproperties.cpp
raster/qgsrasterminmaxwidget.cpp raster/qgsrasterminmaxwidget.cpp
raster/qgsrasterrendererwidget.cpp raster/qgsrasterrendererwidget.cpp
raster/qgssinglebandgrayrendererwidget.cpp raster/qgssinglebandgrayrendererwidget.cpp
@ -337,6 +338,7 @@ SET(QGIS_GUI_SRCS
qgsmaplayeractionregistry.cpp qgsmaplayeractionregistry.cpp
qgsmaplayercombobox.cpp qgsmaplayercombobox.cpp
qgsmaplayerconfigwidgetfactory.cpp qgsmaplayerconfigwidgetfactory.cpp
qgsmaplayerstyleguiutils.cpp
qgsmaplayerstylemanagerwidget.cpp qgsmaplayerstylemanagerwidget.cpp
qgsmapmouseevent.cpp qgsmapmouseevent.cpp
qgsmapoverviewcanvas.cpp qgsmapoverviewcanvas.cpp
@ -541,6 +543,7 @@ SET(QGIS_GUI_HDRS
qgsmaplayercombobox.h qgsmaplayercombobox.h
qgsmaplayerconfigwidget.h qgsmaplayerconfigwidget.h
qgsmaplayerconfigwidgetfactory.h qgsmaplayerconfigwidgetfactory.h
qgsmaplayerstyleguiutils.h
qgsmaplayerstylemanagerwidget.h qgsmaplayerstylemanagerwidget.h
qgsmapmouseevent.h qgsmapmouseevent.h
qgsmapoverviewcanvas.h qgsmapoverviewcanvas.h
@ -831,6 +834,7 @@ SET(QGIS_GUI_HDRS
raster/qgsrendererrasterpropertieswidget.h raster/qgsrendererrasterpropertieswidget.h
raster/qgssinglebandgrayrendererwidget.h raster/qgssinglebandgrayrendererwidget.h
raster/qgssinglebandpseudocolorrendererwidget.h raster/qgssinglebandpseudocolorrendererwidget.h
raster/qgsrasterlayerproperties.h
symbology/characterwidget.h symbology/characterwidget.h
symbology/qgs25drendererwidget.h symbology/qgs25drendererwidget.h
@ -935,6 +939,7 @@ SET(QGIS_GUI_UI_HDRS
${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsowssourceselectbase.h ${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsowssourceselectbase.h
${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsarcgisservicesourceselectbase.h ${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsarcgisservicesourceselectbase.h
${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsprojectionselectorbase.h ${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsprojectionselectorbase.h
${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsrasterlayerpropertiesbase.h
${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsquerybuilderbase.h ${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsquerybuilderbase.h
${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgssqlcomposerdialogbase.h ${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgssqlcomposerdialogbase.h
${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgssublayersdialogbase.h ${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgssublayersdialogbase.h
@ -963,6 +968,7 @@ INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/src/gui/processing ${CMAKE_SOURCE_DIR}/src/gui/processing
${CMAKE_SOURCE_DIR}/src/gui/providers/gdal ${CMAKE_SOURCE_DIR}/src/gui/providers/gdal
${CMAKE_SOURCE_DIR}/src/gui/providers/ogr ${CMAKE_SOURCE_DIR}/src/gui/providers/ogr
${CMAKE_SOURCE_DIR}/src/gui/raster
${CMAKE_SOURCE_DIR}/src/core ${CMAKE_SOURCE_DIR}/src/core
${CMAKE_SOURCE_DIR}/src/core/annotations ${CMAKE_SOURCE_DIR}/src/core/annotations
${CMAKE_SOURCE_DIR}/src/core/auth ${CMAKE_SOURCE_DIR}/src/core/auth

View File

@ -17,27 +17,46 @@
#define QGSMAPLAYERSTYLEGUIUTILS_H #define QGSMAPLAYERSTYLEGUIUTILS_H
#include <QObject> #include <QObject>
#include "qgis_gui.h"
#define SIP_NO_FILE
class QgsMapLayer; class QgsMapLayer;
class QAction; class QAction;
class QMenu; class QMenu;
//! Various GUI utility functions for dealing with map layer's style manager
class QgsMapLayerStyleGuiUtils : public QObject /**
* \ingroup gui
* \class QgsMapLayerStyleGuiUtils
* Various GUI utility functions for dealing with map layer's style manager
* \note not available in Python bindings
* \since QGIS 3.12 (in the GUI API)
*/
class GUI_EXPORT QgsMapLayerStyleGuiUtils : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
/**
* \brief returns a singleton instance of this class
*/
static QgsMapLayerStyleGuiUtils *instance(); static QgsMapLayerStyleGuiUtils *instance();
/**
* \brief adds actions to the menu in accordance to the layer
*/
void addStyleManagerActions( QMenu *m, QgsMapLayer *layer );
private :
QAction *actionAddStyle( QgsMapLayer *layer, QObject *parent = nullptr ); QAction *actionAddStyle( QgsMapLayer *layer, QObject *parent = nullptr );
QAction *actionRemoveStyle( QgsMapLayer *layer, QObject *parent = nullptr ); QAction *actionRemoveStyle( QgsMapLayer *layer, QObject *parent = nullptr );
QAction *actionRenameStyle( QgsMapLayer *layer, QObject *parent = nullptr ); QAction *actionRenameStyle( QgsMapLayer *layer, QObject *parent = nullptr );
QList<QAction *> actionsUseStyle( QgsMapLayer *layer, QObject *parent = nullptr ); QList<QAction *> actionsUseStyle( QgsMapLayer *layer, QObject *parent = nullptr );
//! Add actions for the given map layer to the menu
void addStyleManagerActions( QMenu *m, QgsMapLayer *layer );
private slots: private slots:
void addStyle(); void addStyle();
void useStyle(); void useStyle();

View File

@ -18,7 +18,6 @@
#include <limits> #include <limits>
#include <typeinfo> #include <typeinfo>
#include "qgisapp.h"
#include "qgsgui.h" #include "qgsgui.h"
#include "qgsapplication.h" #include "qgsapplication.h"
#include "qgsbilinearrasterresampler.h" #include "qgsbilinearrasterresampler.h"
@ -55,6 +54,7 @@
#include "qgshuesaturationfilter.h" #include "qgshuesaturationfilter.h"
#include "qgshillshaderendererwidget.h" #include "qgshillshaderendererwidget.h"
#include "qgssettings.h" #include "qgssettings.h"
#include "qgsdatumtransformdialog.h"
#include "qgsmaplayerlegend.h" #include "qgsmaplayerlegend.h"
#include "qgsfileutils.h" #include "qgsfileutils.h"
#include "qgswebview.h" #include "qgswebview.h"
@ -75,6 +75,7 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QVector> #include <QVector>
#include <QUrl> #include <QUrl>
#include <QMenu>
QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer *lyr, QgsMapCanvas *canvas, QWidget *parent, Qt::WindowFlags fl ) QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer *lyr, QgsMapCanvas *canvas, QWidget *parent, Qt::WindowFlags fl )
: QgsOptionsDialogBase( QStringLiteral( "RasterLayerProperties" ), parent, fl ) : QgsOptionsDialogBase( QStringLiteral( "RasterLayerProperties" ), parent, fl )
@ -1272,7 +1273,7 @@ void QgsRasterLayerProperties::pbnAddValuesManually_clicked()
void QgsRasterLayerProperties::mCrsSelector_crsChanged( const QgsCoordinateReferenceSystem &crs ) void QgsRasterLayerProperties::mCrsSelector_crsChanged( const QgsCoordinateReferenceSystem &crs )
{ {
QgisApp::instance()->askUserForDatumTransform( crs, QgsProject::instance()->crs(), mRasterLayer ); QgsDatumTransformDialog::run( crs, QgsProject::instance()->crs(), this, mMapCanvas, tr( "Select Transformation" ) );
mRasterLayer->setCrs( crs ); mRasterLayer->setCrs( crs );
mMetadataWidget->crsChanged(); mMetadataWidget->crsChanged();
} }
@ -1752,7 +1753,7 @@ void QgsRasterLayerProperties::toggleColorizeControls( bool colorizeEnabled )
QLinearGradient QgsRasterLayerProperties::redGradient() QLinearGradient QgsRasterLayerProperties::redGradient()
{ {
//define a gradient //define a gradient
///@TODO change this to actual polygon dims // TODO change this to actual polygon dims
QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight ); QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) ); myGradient.setColorAt( 0.0, QColor( 242, 14, 25, 190 ) );
myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) ); myGradient.setColorAt( 0.5, QColor( 175, 29, 37, 190 ) );
@ -1762,7 +1763,7 @@ QLinearGradient QgsRasterLayerProperties::redGradient()
QLinearGradient QgsRasterLayerProperties::greenGradient() QLinearGradient QgsRasterLayerProperties::greenGradient()
{ {
//define a gradient //define a gradient
///@TODO change this to actual polygon dims // TODO change this to actual polygon dims
QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight ); QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) ); myGradient.setColorAt( 0.0, QColor( 48, 168, 5, 190 ) );
myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) ); myGradient.setColorAt( 0.8, QColor( 36, 122, 4, 190 ) );
@ -1772,7 +1773,7 @@ QLinearGradient QgsRasterLayerProperties::greenGradient()
QLinearGradient QgsRasterLayerProperties::blueGradient() QLinearGradient QgsRasterLayerProperties::blueGradient()
{ {
//define a gradient //define a gradient
///@TODO change this to actual polygon dims // TODO change this to actual polygon dims
QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight ); QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) ); myGradient.setColorAt( 0.0, QColor( 30, 0, 106, 190 ) );
myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) ); myGradient.setColorAt( 0.2, QColor( 30, 72, 128, 190 ) );
@ -1782,7 +1783,7 @@ QLinearGradient QgsRasterLayerProperties::blueGradient()
QLinearGradient QgsRasterLayerProperties::grayGradient() QLinearGradient QgsRasterLayerProperties::grayGradient()
{ {
//define a gradient //define a gradient
///@TODO change this to actual polygon dims // TODO change this to actual polygon dims
QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight ); QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) ); myGradient.setColorAt( 0.0, QColor( 5, 5, 5, 190 ) );
myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) ); myGradient.setColorAt( 0.8, QColor( 122, 122, 122, 190 ) );
@ -1792,7 +1793,7 @@ QLinearGradient QgsRasterLayerProperties::grayGradient()
QLinearGradient QgsRasterLayerProperties::highlightGradient() QLinearGradient QgsRasterLayerProperties::highlightGradient()
{ {
//define another gradient for the highlight //define another gradient for the highlight
///@TODO change this to actual polygon dims // TODO change this to actual polygon dims
QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight ); QLinearGradient myGradient = QLinearGradient( mGradientWidth, 0, mGradientWidth, mGradientHeight );
myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) ); myGradient.setColorAt( 1.0, QColor( 255, 255, 255, 50 ) );
myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) ); myGradient.setColorAt( 0.5, QColor( 255, 255, 255, 100 ) );

View File

@ -27,7 +27,7 @@
#include "qgshelp.h" #include "qgshelp.h"
#include "qgsmaplayerstylemanager.h" #include "qgsmaplayerstylemanager.h"
#include "qgsmaptoolemitpoint.h" #include "qgsmaptoolemitpoint.h"
#include "qgis_app.h" #include "qgis_gui.h"
class QgsPointXY; class QgsPointXY;
class QgsMapLayer; class QgsMapLayer;
@ -39,36 +39,50 @@ class QgsRasterRendererWidget;
class QgsRasterHistogramWidget; class QgsRasterHistogramWidget;
class QgsWebView; class QgsWebView;
/** /**
* \ingroup gui
* \class QgsRasterLayerProperties
* Property sheet for a raster map layer * Property sheet for a raster map layer
*/ * \since QGIS 3.12 (in the GUI API)
class APP_EXPORT QgsRasterLayerProperties : public QgsOptionsDialogBase, private Ui::QgsRasterLayerPropertiesBase */
class GUI_EXPORT QgsRasterLayerProperties : public QgsOptionsDialogBase, private Ui::QgsRasterLayerPropertiesBase
{ {
Q_OBJECT Q_OBJECT
public: public:
/**
* enumeration for the different types of style
*/
#ifndef SIP_RUN
enum StyleType enum StyleType
{ {
QML, QML,
SLD SLD
}; };
Q_ENUM( StyleType ) Q_ENUM( StyleType )
#endif
/** /**
* \brief Constructor * Constructor
* \param ml Map layer for which properties will be displayed * \param lyr Map layer for which properties will be displayed
* \param canvas the QgsMapCanvas instance
* \param parent the parent of this widget
* \param fl windows flag
*/ */
QgsRasterLayerProperties( QgsMapLayer *lyr, QgsMapCanvas *canvas, QWidget *parent = nullptr, Qt::WindowFlags = QgsGuiUtils::ModalDialogFlags ); QgsRasterLayerProperties( QgsMapLayer *lyr, QgsMapCanvas *canvas, QWidget *parent = nullptr, Qt::WindowFlags = QgsGuiUtils::ModalDialogFlags );
//! Synchronize state with associated raster layer protected slots:
void sync(); //! \brief auto slot executed when the active page in the main widget stack is changed
void optionsStackedWidget_CurrentChanged( int index ) override SIP_SKIP ;
private slots:
public slots:
//TODO: Verify that these all need to be public
//! \brief Applies the settings made in the dialog without closing the box //! \brief Applies the settings made in the dialog without closing the box
void apply(); void apply();
//! Called when cancel button is pressed //! \brief Called when cancel button is pressed
void onCancel(); void onCancel();
//! \brief Slot to update layer display name as original is edited. //! \brief Slot to update layer display name as original is edited.
void mLayerOrigNameLineEd_textEdited( const QString &text ); void mLayerOrigNameLineEd_textEdited( const QString &text );
@ -84,8 +98,6 @@ class APP_EXPORT QgsRasterLayerProperties : public QgsOptionsDialogBase, private
void pbnDefaultValues_clicked(); void pbnDefaultValues_clicked();
//! \brief slot executed when user wishes to export transparency values //! \brief slot executed when user wishes to export transparency values
void pbnExportTransparentPixelValues_clicked(); void pbnExportTransparentPixelValues_clicked();
//! \brief auto slot executed when the active page in the main widget stack is changed
void optionsStackedWidget_CurrentChanged( int index ) override;
//! \brief slow executed when user wishes to import transparency values //! \brief slow executed when user wishes to import transparency values
void pbnImportTransparentPixelValues_clicked(); void pbnImportTransparentPixelValues_clicked();
//! \brief slot executed when user presses "Remove Selected Row" button on the transparency page //! \brief slot executed when user presses "Remove Selected Row" button on the transparency page
@ -99,7 +111,8 @@ class APP_EXPORT QgsRasterLayerProperties : public QgsOptionsDialogBase, private
void pixelSelected( const QgsPointXY &, const Qt::MouseButton & ); void pixelSelected( const QgsPointXY &, const Qt::MouseButton & );
private slots:
void mRenderTypeComboBox_currentIndexChanged( int index ); void mRenderTypeComboBox_currentIndexChanged( int index );
//! Load the default style when appropriate button is pressed. //! Load the default style when appropriate button is pressed.
void loadDefaultStyle_clicked(); void loadDefaultStyle_clicked();
@ -233,6 +246,9 @@ class APP_EXPORT QgsRasterLayerProperties : public QgsOptionsDialogBase, private
bool mMetadataFilled; bool mMetadataFilled;
//! Synchronize state with associated raster layer
void sync();
friend class QgsAppScreenShots; friend class QgsAppScreenShots;
}; };
#endif #endif

View File

@ -70,6 +70,7 @@ INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/src/gui ${CMAKE_SOURCE_DIR}/src/gui
${CMAKE_SOURCE_DIR}/src/gui/editorwidgets ${CMAKE_SOURCE_DIR}/src/gui/editorwidgets
${CMAKE_SOURCE_DIR}/src/gui/layertree ${CMAKE_SOURCE_DIR}/src/gui/layertree
${CMAKE_SOURCE_DIR}/src/gui/raster
${CMAKE_SOURCE_DIR}/src/plugins ${CMAKE_SOURCE_DIR}/src/plugins
${CMAKE_SOURCE_DIR}/external ${CMAKE_SOURCE_DIR}/external
${CMAKE_SOURCE_DIR}/external/nlohmann ${CMAKE_SOURCE_DIR}/external/nlohmann

View File

@ -49,7 +49,7 @@
#include "qgsproject.h" #include "qgsproject.h"
#include "qgsrasterlayer.h" #include "qgsrasterlayer.h"
#include "../../app/qgsrasterlayerproperties.h" #include "../../gui/raster/qgsrasterlayerproperties.h"
#include "qgsproviderregistry.h" #include "qgsproviderregistry.h"
#include "qgsgeorefdatapoint.h" #include "qgsgeorefdatapoint.h"

View File

@ -2174,7 +2174,7 @@ p, li { white-space: pre-wrap; }
<customwidget> <customwidget>
<class>QgsRasterBandComboBox</class> <class>QgsRasterBandComboBox</class>
<extends>QComboBox</extends> <extends>QComboBox</extends>
<header>raster/qgsrasterbandcombobox.h</header> <header>qgsrasterbandcombobox.h</header>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>QgsWebView</class> <class>QgsWebView</class>

View File

@ -371,11 +371,6 @@
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget>
<class>QgsRasterBandComboBox</class>
<extends>QComboBox</extends>
<header>raster/qgsrasterbandcombobox.h</header>
</customwidget>
<customwidget> <customwidget>
<class>QgsCollapsibleGroupBox</class> <class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends> <extends>QGroupBox</extends>