QGIS API Documentation 3.41.0-Master (fda2aa46e9a)
Loading...
Searching...
No Matches
qgsrendererrasterpropertieswidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsrendererrasterpropertieswidget.cpp
3 ---------------------
4 begin : May 2016
5 copyright : (C) 2016 by Nathan Woodrow
6 email : woodrow dot nathan 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 ***************************************************************************/
16#include "moc_qgsrendererrasterpropertieswidget.cpp"
17
18#include "qgis.h"
19#include "qgsmapcanvas.h"
23#include "qgsrasterlayer.h"
34#include "qgsapplication.h"
35#include "qgsproject.h"
36#include "qgsprojectutils.h"
37
38void QgsRendererRasterPropertiesWidget::initRendererWidgetFunctions()
39{
40 static bool sInitialized = false;
41 if ( sInitialized )
42 return;
43
51
52 sInitialized = true;
53}
54
56 : QgsMapLayerConfigWidget( layer, canvas, parent )
57 , mRasterLayer( qobject_cast<QgsRasterLayer *>( layer ) )
58{
59 if ( !mRasterLayer )
60 return;
61
62 setupUi( this );
63 connect( mResetColorRenderingBtn, &QToolButton::clicked, this, &QgsRendererRasterPropertiesWidget::mResetColorRenderingBtn_clicked );
64
65 initRendererWidgetFunctions();
66
67 mResamplingUtils.initWidgets( mRasterLayer, mZoomedInResamplingComboBox, mZoomedOutResamplingComboBox, mMaximumOversamplingSpinBox, mCbEarlyResampling );
68
69 connect( cboRenderers, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsRendererRasterPropertiesWidget::rendererChanged );
70
71 connect( mSliderBrightness, &QAbstractSlider::valueChanged, mBrightnessSpinBox, &QSpinBox::setValue );
72 connect( mBrightnessSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mSliderBrightness, &QAbstractSlider::setValue );
73 mBrightnessSpinBox->setClearValue( 0 );
74
75 connect( mSliderContrast, &QAbstractSlider::valueChanged, mContrastSpinBox, &QSpinBox::setValue );
76 connect( mContrastSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mSliderContrast, &QAbstractSlider::setValue );
77 mContrastSpinBox->setClearValue( 0 );
78
79 connect( mSliderGamma, &QAbstractSlider::valueChanged, this, &QgsRendererRasterPropertiesWidget::updateGammaSpinBox );
80 connect( mGammaSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsRendererRasterPropertiesWidget::updateGammaSlider );
81 mGammaSpinBox->setClearValue( 1.0 );
82
83 // Connect saturation slider and spin box
84 connect( sliderSaturation, &QAbstractSlider::valueChanged, spinBoxSaturation, &QSpinBox::setValue );
85 connect( spinBoxSaturation, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), sliderSaturation, &QAbstractSlider::setValue );
86 spinBoxSaturation->setClearValue( 0 );
87
88 // Connect colorize strength slider and spin box
89 connect( sliderColorizeStrength, &QAbstractSlider::valueChanged, spinColorizeStrength, &QSpinBox::setValue );
90 connect( spinColorizeStrength, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), sliderColorizeStrength, &QAbstractSlider::setValue );
91 spinColorizeStrength->setClearValue( 100 );
92
93 // enable or disable saturation slider and spin box depending on grayscale combo choice
94 connect( comboGrayscale, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsRendererRasterPropertiesWidget::toggleSaturationControls );
95
96 // enable or disable colorize colorbutton with colorize checkbox
97 connect( mColorizeCheck, &QAbstractButton::toggled, this, &QgsRendererRasterPropertiesWidget::toggleColorizeControls );
98
99 // Just connect the spin boxes because the sliders update the spinners
100 connect( mBrightnessSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsPanelWidget::widgetChanged );
101 connect( mContrastSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsPanelWidget::widgetChanged );
102 connect( mGammaSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsPanelWidget::widgetChanged );
103 connect( spinBoxSaturation, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsPanelWidget::widgetChanged );
104 connect( spinColorizeStrength, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsPanelWidget::widgetChanged );
105 connect( btnColorizeColor, &QgsColorButton::colorChanged, this, &QgsPanelWidget::widgetChanged );
106 connect( mInvertColorsCheck, &QAbstractButton::toggled, this, &QgsPanelWidget::widgetChanged );
107
108 connect( mBlendModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
109 connect( mZoomedInResamplingComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
110 connect( mZoomedOutResamplingComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
111 connect( mMaximumOversamplingSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsPanelWidget::widgetChanged );
112 connect( mCbEarlyResampling, &QAbstractButton::toggled, this, &QgsPanelWidget::widgetChanged );
113
114 // finally sync to the layer - even though some actions may emit widgetChanged signal,
115 // this is not a problem - nobody is listening to our signals yet
116 syncToLayer( mRasterLayer );
117
118 connect( mRasterLayer, &QgsMapLayer::styleChanged, this, &QgsRendererRasterPropertiesWidget::refreshAfterStyleChanged );
119}
120
125
127{
128 const QString rendererName = cboRenderers->currentData().toString();
129 setRendererWidget( rendererName );
130 emit widgetChanged();
131}
132
134{
135 if ( QgsBrightnessContrastFilter *brightnessFilter = mRasterLayer->brightnessFilter() )
136 {
137 brightnessFilter->setBrightness( mSliderBrightness->value() );
138 brightnessFilter->setContrast( mSliderContrast->value() );
139 brightnessFilter->setGamma( mGammaSpinBox->value() );
140 }
141
142 if ( QgsRasterRendererWidget *rendererWidget = dynamic_cast<QgsRasterRendererWidget *>( stackedWidget->currentWidget() ) )
143 {
144 rendererWidget->doComputations();
145
146 if ( QgsRasterRenderer *newRenderer = rendererWidget->renderer() )
147 {
148 // there are transparency related data stored in renderer instances, but they
149 // are not configured in the widget, so we need to copy them over from existing renderer
150 if ( QgsRasterRenderer *oldRenderer = mRasterLayer->renderer() )
151 newRenderer->copyCommonProperties( oldRenderer, false );
152 mRasterLayer->setRenderer( newRenderer );
153 }
154 }
155
156 // Hue and saturation controls
157 if ( QgsHueSaturationFilter *hueSaturationFilter = mRasterLayer->hueSaturationFilter() )
158 {
159 hueSaturationFilter->setSaturation( sliderSaturation->value() );
160 hueSaturationFilter->setGrayscaleMode( ( QgsHueSaturationFilter::GrayscaleMode ) comboGrayscale->currentIndex() );
161 hueSaturationFilter->setColorizeOn( mColorizeCheck->checkState() );
162 hueSaturationFilter->setColorizeColor( btnColorizeColor->color() );
163 hueSaturationFilter->setColorizeStrength( sliderColorizeStrength->value() );
164 hueSaturationFilter->setInvertColors( mInvertColorsCheck->isChecked() );
165 }
166
167 mResamplingUtils.refreshLayerFromWidgets();
168
169 mRasterLayer->setBlendMode( mBlendModeComboBox->blendMode() );
170}
171
173{
174 mRasterLayer = layer;
175
176 cboRenderers->blockSignals( true );
177 cboRenderers->clear();
179 const auto constRenderersList = QgsApplication::rasterRendererRegistry()->renderersList();
180 for ( const QString &name : constRenderersList )
181 {
183 {
184 if ( ( mRasterLayer->rasterType() != Qgis::RasterLayerType::SingleBandColorData && entry.name != QLatin1String( "singlebandcolordata" ) ) ||
185 ( mRasterLayer->rasterType() == Qgis::RasterLayerType::SingleBandColorData && entry.name == QLatin1String( "singlebandcolordata" ) ) )
186 {
187 cboRenderers->addItem( entry.icon(), entry.visibleName, entry.name );
188 }
189 }
190 }
191 cboRenderers->setCurrentIndex( -1 );
192 cboRenderers->blockSignals( false );
193
194 if ( QgsRasterRenderer *renderer = mRasterLayer->renderer() )
195 {
196 setRendererWidget( renderer->type() );
197 }
198
199 if ( QgsBrightnessContrastFilter *brightnessFilter = mRasterLayer->brightnessFilter() )
200 {
201 mSliderBrightness->setValue( brightnessFilter->brightness() );
202 mSliderContrast->setValue( brightnessFilter->contrast() );
203 mGammaSpinBox->setValue( brightnessFilter->gamma() );
204 }
205
206 btnColorizeColor->setColorDialogTitle( tr( "Select Color" ) );
207 btnColorizeColor->setContext( QStringLiteral( "symbology" ) );
208
209 // Hue and saturation color control
210 //set hue and saturation controls to current values
211 if ( const QgsHueSaturationFilter *hueSaturationFilter = mRasterLayer->hueSaturationFilter() )
212 {
213 sliderSaturation->setValue( hueSaturationFilter->saturation() );
214 comboGrayscale->setCurrentIndex( ( int ) hueSaturationFilter->grayscaleMode() );
215
216 // Set initial state of saturation controls based on grayscale mode choice
217 toggleSaturationControls( static_cast<int>( hueSaturationFilter->grayscaleMode() ) );
218
219 // Set initial state of colorize controls
220 mColorizeCheck->setChecked( hueSaturationFilter->colorizeOn() );
221 btnColorizeColor->setColor( hueSaturationFilter->colorizeColor() );
222 toggleColorizeControls( hueSaturationFilter->colorizeOn() );
223 sliderColorizeStrength->setValue( hueSaturationFilter->colorizeStrength() );
224
225 mInvertColorsCheck->setChecked( hueSaturationFilter->invertColors() );
226 }
227
228 //blend mode
229 mBlendModeComboBox->setShowClippingModes( QgsProjectUtils::layerIsContainedInGroupLayer( QgsProject::instance(), mRasterLayer ) );
230 mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
231
232 //set combo boxes to current resampling types
233 mResamplingUtils.refreshWidgetsFromLayer();
234}
235
236void QgsRendererRasterPropertiesWidget::mResetColorRenderingBtn_clicked()
237{
238 mBlendModeComboBox->setBlendMode( QPainter::CompositionMode_SourceOver );
239 mSliderBrightness->setValue( 0 );
240 mSliderContrast->setValue( 0 );
241 mGammaSpinBox->setValue( 1.0 );
242 sliderSaturation->setValue( 0 );
243 comboGrayscale->setCurrentIndex( ( int ) QgsHueSaturationFilter::GrayscaleOff );
244 mColorizeCheck->setChecked( false );
245 sliderColorizeStrength->setValue( 100 );
246 mInvertColorsCheck->setChecked( false );
247}
248
249void QgsRendererRasterPropertiesWidget::toggleSaturationControls( int grayscaleMode )
250{
251 // Enable or disable saturation controls based on choice of grayscale mode
252 if ( grayscaleMode == 0 )
253 {
254 sliderSaturation->setEnabled( true );
255 spinBoxSaturation->setEnabled( true );
256 }
257 else
258 {
259 sliderSaturation->setEnabled( false );
260 spinBoxSaturation->setEnabled( false );
261 }
262 emit widgetChanged();
263}
264
265void QgsRendererRasterPropertiesWidget::toggleColorizeControls( bool colorizeEnabled )
266{
267 // Enable or disable colorize controls based on checkbox
268 btnColorizeColor->setEnabled( colorizeEnabled );
269 sliderColorizeStrength->setEnabled( colorizeEnabled );
270 spinColorizeStrength->setEnabled( colorizeEnabled );
271 emit widgetChanged();
272}
273
274void QgsRendererRasterPropertiesWidget::setRendererWidget( const QString &rendererName )
275{
276 QgsDebugMsgLevel( "rendererName = " + rendererName, 3 );
277 QgsRasterRendererWidget *oldWidget = mRendererWidget;
278
279 int alphaBand = -1;
280 double opacity = 1;
281 QColor nodataColor;
282 if ( QgsRasterRenderer *oldRenderer = mRasterLayer->renderer() )
283 {
284 // Retain alpha band and opacity when switching renderer
285 alphaBand = oldRenderer->alphaBand();
286 opacity = oldRenderer->opacity();
287 nodataColor = oldRenderer->nodataColor();
288 }
289
290 QgsRasterRendererRegistryEntry rendererEntry;
291 if ( QgsApplication::rasterRendererRegistry()->rendererData( rendererName, rendererEntry ) )
292 {
293 if ( rendererEntry.widgetCreateFunction ) // Single band color data renderer e.g. has no widget
294 {
295 QgsDebugMsgLevel( QStringLiteral( "renderer has widgetCreateFunction" ), 3 );
296 // Current canvas extent (used to calc min/max) in layer CRS
299 : mRasterLayer->extent();
300 if ( oldWidget )
301 {
302 std::unique_ptr< QgsRasterRenderer > oldRenderer( oldWidget->renderer() );
303 if ( !oldRenderer || oldRenderer->type() != rendererName )
304 {
305 if ( rendererName == QLatin1String( "singlebandgray" ) )
306 {
307 whileBlocking( mRasterLayer )->setRenderer( QgsApplication::rasterRendererRegistry()->defaultRendererForDrawingStyle( Qgis::RasterDrawingStyle::SingleBandGray, mRasterLayer->dataProvider() ) );
308 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
309 }
310 else if ( rendererName == QLatin1String( "multibandcolor" ) )
311 {
312 whileBlocking( mRasterLayer )->setRenderer( QgsApplication::rasterRendererRegistry()->defaultRendererForDrawingStyle( Qgis::RasterDrawingStyle::MultiBandColor, mRasterLayer->dataProvider() ) );
313 whileBlocking( mRasterLayer )->setDefaultContrastEnhancement();
314 }
315 }
316 }
317 mRasterLayer->renderer()->setAlphaBand( alphaBand );
318 mRasterLayer->renderer()->setOpacity( opacity );
319 mRasterLayer->renderer()->setNodataColor( nodataColor );
320 mRendererWidget = rendererEntry.widgetCreateFunction( mRasterLayer, myExtent );
321 mRendererWidget->setMapCanvas( mMapCanvas );
323 stackedWidget->addWidget( mRendererWidget );
324 stackedWidget->setCurrentWidget( mRendererWidget );
325 if ( oldWidget )
326 {
327 // Compare used bands in new and old renderer and reset transparency dialog if different
328 QgsRasterRenderer *oldRenderer = oldWidget->renderer();
329 QgsRasterRenderer *newRenderer = mRendererWidget->renderer();
330#if 0
331 QList<int> oldBands = oldRenderer->usesBands();
332 QList<int> newBands = newRenderer->usesBands();
333
334 if ( oldBands != newBands )
335 {
336 populateTransparencyTable( newRenderer );
337 }
338#endif
339
340 delete oldRenderer;
341 delete newRenderer;
342 }
343 }
344 }
345
346 if ( mRendererWidget != oldWidget )
347 delete oldWidget;
348
349 const int widgetIndex = cboRenderers->findData( rendererName );
350 if ( widgetIndex != -1 )
351 {
352 whileBlocking( cboRenderers )->setCurrentIndex( widgetIndex );
353 }
354
355}
356
357void QgsRendererRasterPropertiesWidget::refreshAfterStyleChanged()
358{
359 if ( mRendererWidget )
360 {
361 QgsRasterRenderer *renderer = mRasterLayer->renderer();
362 if ( QgsMultiBandColorRenderer *mbcr = dynamic_cast<QgsMultiBandColorRenderer *>( renderer ) )
363 {
364 const QgsContrastEnhancement *redCe = mbcr->redContrastEnhancement();
365 if ( redCe )
366 {
367 mRendererWidget->setMin( QLocale().toString( redCe->minimumValue() ), 0 );
368 mRendererWidget->setMax( QLocale().toString( redCe->maximumValue() ), 0 );
369 }
370 const QgsContrastEnhancement *greenCe = mbcr->greenContrastEnhancement();
371 if ( greenCe )
372 {
373 mRendererWidget->setMin( QLocale().toString( greenCe->minimumValue() ), 1 );
374 mRendererWidget->setMax( QLocale().toString( greenCe->maximumValue() ), 1 );
375 }
376 const QgsContrastEnhancement *blueCe = mbcr->blueContrastEnhancement();
377 if ( blueCe )
378 {
379 mRendererWidget->setMin( QLocale().toString( blueCe->minimumValue() ), 2 );
380 mRendererWidget->setMax( QLocale().toString( blueCe->maximumValue() ), 2 );
381 }
382 }
383 else if ( QgsSingleBandGrayRenderer *sbgr = dynamic_cast<QgsSingleBandGrayRenderer *>( renderer ) )
384 {
385 const QgsContrastEnhancement *ce = sbgr->contrastEnhancement();
386 if ( ce )
387 {
388 mRendererWidget->setMin( QLocale().toString( ce->minimumValue() ) );
389 mRendererWidget->setMax( QLocale().toString( ce->maximumValue() ) );
390 }
391 }
392 }
393}
394
395void QgsRendererRasterPropertiesWidget::updateGammaSpinBox( int value )
396{
397 mGammaSpinBox->setValue( value / 100.0 );
398}
399
400void QgsRendererRasterPropertiesWidget::updateGammaSlider( double value )
401{
402 mSliderGamma->setValue( value * 100 );
403}
@ SingleBandColorData
Single band containing color data.
@ SingleBandGray
A single band image drawn as a range of gray colors.
@ MultiBandColor
A layer containing 2 or more bands, mapped to RGB color space. In the case of a multiband with only t...
static QgsRasterRendererRegistry * rasterRendererRegistry()
Returns the application's raster renderer registry, used for managing raster layer renderers.
Brightness/contrast and gamma correction filter pipe for rasters.
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
Manipulates raster or point cloud pixel values so that they enhanceContrast or clip into a specified ...
double minimumValue() const
Returns the minimum value for the contrast enhancement range.
double maximumValue() const
Returns the maximum value for the contrast enhancement range.
static bool isTransformationPossible(const QgsCoordinateReferenceSystem &source, const QgsCoordinateReferenceSystem &destination)
Returns true if it is theoretically possible to transform between source and destination CRSes.
static QgsRasterRendererWidget * create(QgsRasterLayer *layer, const QgsRectangle &extent)
Factory method to create the renderer for this type.
Color and saturation filter pipe for rasters.
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
A panel widget that can be shown in the map style dock.
Base class for all map layer types.
Definition qgsmaplayer.h:76
virtual QgsRectangle extent() const
Returns the extent of the layer.
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:83
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
void styleChanged()
Signal emitted whenever a change affects the layer's style.
QgsRectangle outputExtentToLayerExtent(const QgsMapLayer *layer, QgsRectangle extent) const
transform bounding box from output CRS to layer's CRS
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
static QgsRasterRendererWidget * create(QgsRasterLayer *layer, const QgsRectangle &extent)
Renderer for multiband images with the color components.
static QgsRasterRendererWidget * create(QgsRasterLayer *layer, const QgsRectangle &extent)
void widgetChanged()
Emitted when the widget state changes.
static bool layerIsContainedInGroupLayer(QgsProject *project, QgsMapLayer *layer)
Returns true if the specified layer is a child layer from any QgsGroupLayer in the given project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
static QgsRasterRendererWidget * create(QgsRasterLayer *layer, const QgsRectangle &extent)
Widget creation function (mainly for the use by the renderer registry)
Represents a raster layer.
Qgis::RasterLayerType rasterType() const
Returns the raster layer type (which is a read only property).
QgsBrightnessContrastFilter * brightnessFilter() const
Returns the raster's brightness/contrast filter.
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
void setRenderer(QgsRasterRenderer *renderer)
Sets the raster's renderer.
QgsHueSaturationFilter * hueSaturationFilter() const
Returns the raster's hue/saturation filter.
void insertWidgetFunction(const QString &rendererName, QgsRasterRendererWidgetCreateFunc func)
Sets the widget creation function for a renderer.
bool rendererData(const QString &rendererName, QgsRasterRendererRegistryEntry &data) const
Retrieves renderer data from the registry.
QStringList renderersList() const
Returns a list of the names of registered renderers.
Abstract base class for widgets which configure a QgsRasterRenderer.
virtual void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
virtual void setMax(const QString &value, int index=0)
virtual void setMin(const QString &value, int index=0)
virtual QgsRasterRenderer * renderer()=0
Creates a new renderer, using the properties defined in the widget.
void widgetChanged()
Emitted when something on the widget has changed.
Raster renderer pipe that applies colors to a raster.
virtual QList< int > usesBands() const
Returns a list of band numbers used by the renderer.
void setAlphaBand(int band)
void setOpacity(double opacity)
Sets the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
void setNodataColor(const QColor &color)
Sets the color to use for shading nodata pixels.
static QgsRasterRendererWidget * create(QgsRasterLayer *layer, const QgsRectangle &extent)
Widget creation function (use by the renderer registry)
A rectangle specified with double values.
void rendererChanged()
called when user changes renderer type
QgsRendererRasterPropertiesWidget(QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent=nullptr)
A widget to hold the renderer properties for a raster layer.
void syncToLayer(QgsRasterLayer *layer)
Sync the widget to the given layer.
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the dialog.
void apply() override
Apply the changes from the dialog to the layer.
static QgsRasterRendererWidget * create(QgsRasterLayer *layer, const QgsRectangle &extent)
Raster renderer pipe for single band gray.
static QgsRasterRendererWidget * create(QgsRasterLayer *layer, const QgsRectangle &extent)
Creates new raster renderer widget.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition qgis.h:5821
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:39
Registry for raster renderer entries.
QgsRasterRendererWidgetCreateFunc widgetCreateFunction