From 22fe235648853399acdcdfec7dd5125c573af1fb Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Wed, 11 Dec 2024 09:11:44 +0000 Subject: [PATCH] Virtual point clouds - Tile Labels (#59726) * Add label rendering into VPC tiles * Move tile labels rendering into QgsPointCloudExtentRenderer * Rework showLabels flag once more & connect it to widget * Add widget for label TextFormat WIP * Rework and fix text format widget issues * Improve default text format used in VPC labels * Fix banned keywords issue * Fix QgsTextFormat review issue * Fix labels drawing efficiency issue * Fix formating issues * Fix review issues --- .../qgspointcloudextentrenderer.sip.in | 14 + .../pointcloud/qgspointcloudrenderer.sip.in | 29 + .../qgspointcloudextentrenderer.sip.in | 14 + .../pointcloud/qgspointcloudrenderer.sip.in | 29 + .../qgspointcloudextentrenderer.cpp | 26 +- .../pointcloud/qgspointcloudextentrenderer.h | 13 + .../pointcloud/qgspointcloudlayerrenderer.cpp | 36 +- src/core/pointcloud/qgspointcloudrenderer.cpp | 31 +- src/core/pointcloud/qgspointcloudrenderer.h | 31 +- .../qgspointcloudrendererpropertieswidget.cpp | 35 +- .../qgspointcloudrendererpropsdialogbase.ui | 534 +++++++++--------- 11 files changed, 504 insertions(+), 288 deletions(-) diff --git a/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in b/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in index a5d86dd9d67..2717b56867f 100644 --- a/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in +++ b/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in @@ -77,6 +77,20 @@ Sets the ``symbol`` used to render the cloud's extent. Ownership of ``symbol`` is transferred to the renderer. .. seealso:: :py:func:`fillSymbol` +%End + + void renderLabel( const QRectF &extent, const QString &text, QgsPointCloudRenderContext &context ) const; +%Docstring +Renders a label inside the specified extent rectangle. + +The label will be rendered centered horizontally and vertically inside ``extent``. If the label is too large to fit +inside this rectangle, it will not be rendered. + +:param extent: rectangle (in painter coordinates) inside which the label will be rendered +:param text: label text to render +:param context: point cloud rendering context + +.. versionadded:: 3.42 %End }; diff --git a/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in b/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in index 29789d817ad..8960f45ba28 100644 --- a/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in +++ b/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in @@ -547,6 +547,35 @@ Creates a set of legend nodes representing the renderer. virtual QStringList legendRuleKeys() const; %Docstring Returns a list of all rule keys for legend nodes created by the renderer. +%End + + void setShowLabels( const bool show ); +%Docstring +Set whether the renderer should also render file labels inside extent + +.. versionadded:: 3.42 +%End + + bool showLabels() const; +%Docstring +Returns whether the renderer shows file labels inside the extent +rectangle + +.. versionadded:: 3.42 +%End + + void setLabelTextFormat( const QgsTextFormat &textFormat ); +%Docstring +Sets the text format renderers should use for rendering labels + +.. versionadded:: 3.42 +%End + + QgsTextFormat labelTextFormat() const; +%Docstring +Returns the text format renderer is using for rendering labels + +.. versionadded:: 3.42 %End protected: diff --git a/python/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in b/python/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in index a5d86dd9d67..2717b56867f 100644 --- a/python/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in +++ b/python/core/auto_generated/pointcloud/qgspointcloudextentrenderer.sip.in @@ -77,6 +77,20 @@ Sets the ``symbol`` used to render the cloud's extent. Ownership of ``symbol`` is transferred to the renderer. .. seealso:: :py:func:`fillSymbol` +%End + + void renderLabel( const QRectF &extent, const QString &text, QgsPointCloudRenderContext &context ) const; +%Docstring +Renders a label inside the specified extent rectangle. + +The label will be rendered centered horizontally and vertically inside ``extent``. If the label is too large to fit +inside this rectangle, it will not be rendered. + +:param extent: rectangle (in painter coordinates) inside which the label will be rendered +:param text: label text to render +:param context: point cloud rendering context + +.. versionadded:: 3.42 %End }; diff --git a/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in b/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in index 29789d817ad..8960f45ba28 100644 --- a/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in +++ b/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in @@ -547,6 +547,35 @@ Creates a set of legend nodes representing the renderer. virtual QStringList legendRuleKeys() const; %Docstring Returns a list of all rule keys for legend nodes created by the renderer. +%End + + void setShowLabels( const bool show ); +%Docstring +Set whether the renderer should also render file labels inside extent + +.. versionadded:: 3.42 +%End + + bool showLabels() const; +%Docstring +Returns whether the renderer shows file labels inside the extent +rectangle + +.. versionadded:: 3.42 +%End + + void setLabelTextFormat( const QgsTextFormat &textFormat ); +%Docstring +Sets the text format renderers should use for rendering labels + +.. versionadded:: 3.42 +%End + + QgsTextFormat labelTextFormat() const; +%Docstring +Returns the text format renderer is using for rendering labels + +.. versionadded:: 3.42 %End protected: diff --git a/src/core/pointcloud/qgspointcloudextentrenderer.cpp b/src/core/pointcloud/qgspointcloudextentrenderer.cpp index 388c2574d1f..baec5441c7f 100644 --- a/src/core/pointcloud/qgspointcloudextentrenderer.cpp +++ b/src/core/pointcloud/qgspointcloudextentrenderer.cpp @@ -16,14 +16,18 @@ ***************************************************************************/ #include "qgspointcloudextentrenderer.h" -#include "qgspointcloudblock.h" -#include "qgssymbollayerutils.h" -#include "qgssymbol.h" -#include "qgspolygon.h" #include "qgscurve.h" -#include "qgslinesymbollayer.h" -#include "qgslayertreemodellegendnode.h" #include "qgsfillsymbol.h" +#include "qgslayertreemodellegendnode.h" +#include "qgslinesymbollayer.h" +#include "qgspointcloudblock.h" +#include "qgspolygon.h" +#include "qgsstyle.h" +#include "qgssymbol.h" +#include "qgssymbollayerutils.h" +#include "qgstextdocument.h" +#include "qgstextdocumentmetrics.h" +#include "qgstextrenderer.h" QgsPointCloudExtentRenderer::QgsPointCloudExtentRenderer( QgsFillSymbol *symbol ) : mFillSymbol( symbol ? symbol : defaultFillSymbol() ) @@ -134,6 +138,16 @@ void QgsPointCloudExtentRenderer::setFillSymbol( QgsFillSymbol *symbol ) { mFillSymbol.reset( symbol ); } +void QgsPointCloudExtentRenderer::renderLabel( const QRectF &extent, const QString &text, QgsPointCloudRenderContext &context ) const +{ + const QgsTextDocument doc = QgsTextDocument::fromTextAndFormat( {text}, labelTextFormat() ); + const QgsTextDocumentMetrics metrics = QgsTextDocumentMetrics::calculateMetrics( doc, labelTextFormat(), context.renderContext() ); + const QSizeF textSize = metrics.documentSize( Qgis::TextLayoutMode::Rectangle, labelTextFormat().orientation() ); + if ( textSize.width() < extent.width() && textSize.height() < extent.height() ) + { + QgsTextRenderer::drawDocument( extent, labelTextFormat(), metrics.document(), metrics, context.renderContext(), Qgis::TextHorizontalAlignment::Center, Qgis::TextVerticalAlignment::VerticalCenter ); + } +} QDomElement QgsPointCloudExtentRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context ) const { diff --git a/src/core/pointcloud/qgspointcloudextentrenderer.h b/src/core/pointcloud/qgspointcloudextentrenderer.h index afbcfc12aca..64e03881800 100644 --- a/src/core/pointcloud/qgspointcloudextentrenderer.h +++ b/src/core/pointcloud/qgspointcloudextentrenderer.h @@ -83,6 +83,19 @@ class CORE_EXPORT QgsPointCloudExtentRenderer : public QgsPointCloudRenderer */ void setFillSymbol( QgsFillSymbol *symbol SIP_TRANSFER ); + /** + * Renders a label inside the specified extent rectangle. + * + * The label will be rendered centered horizontally and vertically inside \a extent. If the label is too large to fit + * inside this rectangle, it will not be rendered. + * + * \param extent rectangle (in painter coordinates) inside which the label will be rendered + * \param text label text to render + * \param context point cloud rendering context + * \since QGIS 3.42 + */ + void renderLabel( const QRectF &extent, const QString &text, QgsPointCloudRenderContext &context ) const; + private: std::unique_ptr< QgsFillSymbol > mFillSymbol; diff --git a/src/core/pointcloud/qgspointcloudlayerrenderer.cpp b/src/core/pointcloud/qgspointcloudlayerrenderer.cpp index d4baafe8083..71a2043f82a 100644 --- a/src/core/pointcloud/qgspointcloudlayerrenderer.cpp +++ b/src/core/pointcloud/qgspointcloudlayerrenderer.cpp @@ -18,24 +18,24 @@ #include #include -#include "qgspointcloudlayerrenderer.h" -#include "qgspointcloudlayer.h" -#include "qgsrendercontext.h" -#include "qgspointcloudindex.h" +#include "qgsapplication.h" #include "qgscolorramp.h" #include "qgselevationmap.h" -#include "qgsmeshlayerutils.h" -#include "qgspointcloudrequest.h" -#include "qgspointcloudattribute.h" -#include "qgspointcloudrenderer.h" -#include "qgspointcloudextentrenderer.h" #include "qgslogger.h" -#include "qgspointcloudlayerelevationproperties.h" -#include "qgsmessagelog.h" #include "qgsmapclippingutils.h" +#include "qgsmeshlayerutils.h" +#include "qgsmessagelog.h" +#include "qgspointcloudattribute.h" #include "qgspointcloudblockrequest.h" +#include "qgspointcloudextentrenderer.h" +#include "qgspointcloudindex.h" +#include "qgspointcloudlayer.h" +#include "qgspointcloudlayerelevationproperties.h" +#include "qgspointcloudlayerrenderer.h" +#include "qgspointcloudrenderer.h" +#include "qgspointcloudrequest.h" +#include "qgsrendercontext.h" #include "qgsruntimeprofiler.h" -#include "qgsapplication.h" #include @@ -59,7 +59,11 @@ QgsPointCloudLayerRenderer::QgsPointCloudLayerRenderer( QgsPointCloudLayer *laye mRenderer.reset( mLayer->renderer()->clone() ); if ( !mSubIndexes.isEmpty() ) + { mSubIndexExtentRenderer.reset( new QgsPointCloudExtentRenderer() ); + mSubIndexExtentRenderer->setShowLabels( mRenderer->showLabels() ); + mSubIndexExtentRenderer->setLabelTextFormat( mRenderer->labelTextFormat() ); + } if ( mLayer->dataProvider()->index() ) { @@ -211,6 +215,14 @@ bool QgsPointCloudLayerRenderer::render() // when dealing with virtual point clouds, we want to render the individual extents when zoomed out // and only use the selected renderer when zoomed in mSubIndexExtentRenderer->renderExtent( si.polygonBounds(), context ); + // render the label of point cloud tile + if ( mSubIndexExtentRenderer->showLabels() ) + { + mSubIndexExtentRenderer->renderLabel( + context.renderContext().mapToPixel().transformBounds( si.extent().toRectF() ), + si.uri().section( "/", -1 ).section( ".", 0, 0 ), + context ); + } } else { diff --git a/src/core/pointcloud/qgspointcloudrenderer.cpp b/src/core/pointcloud/qgspointcloudrenderer.cpp index 83204c24200..b7b8895fc6a 100644 --- a/src/core/pointcloud/qgspointcloudrenderer.cpp +++ b/src/core/pointcloud/qgspointcloudrenderer.cpp @@ -61,6 +61,16 @@ void QgsPointCloudRenderContext::setAttributes( const QgsPointCloudAttributeColl attributes.find( QStringLiteral( "Z" ), mZOffset ); } +QgsPointCloudRenderer::QgsPointCloudRenderer() +{ + QgsTextFormat textFormat = QgsStyle::defaultStyle()->defaultTextFormat(); + QgsTextBufferSettings settings; + settings.setEnabled( true ); + settings.setSize( 1 ); + textFormat.setBuffer( settings ); + mLabelTextFormat = ( textFormat ); +} + QgsPointCloudRenderer *QgsPointCloudRenderer::load( QDomElement &element, const QgsReadWriteContext &context ) { if ( element.isNull() ) @@ -205,9 +215,12 @@ void QgsPointCloudRenderer::copyCommonProperties( QgsPointCloudRenderer *destina destination->setHorizontalTriangleFilter( mHorizontalTriangleFilter ); destination->setHorizontalTriangleFilterThreshold( mHorizontalTriangleFilterThreshold ); destination->setHorizontalTriangleFilterUnit( mHorizontalTriangleFilterUnit ); + + destination->setShowLabels( mShowLabels ); + destination->setLabelTextFormat( mLabelTextFormat ); } -void QgsPointCloudRenderer::restoreCommonProperties( const QDomElement &element, const QgsReadWriteContext & ) +void QgsPointCloudRenderer::restoreCommonProperties( const QDomElement &element, const QgsReadWriteContext &context ) { mPointSize = element.attribute( QStringLiteral( "pointSize" ), QStringLiteral( "1" ) ).toDouble(); mPointSizeUnit = QgsUnitTypes::decodeRenderUnit( element.attribute( QStringLiteral( "pointSizeUnit" ), QStringLiteral( "MM" ) ) ); @@ -222,9 +235,16 @@ void QgsPointCloudRenderer::restoreCommonProperties( const QDomElement &element, mHorizontalTriangleFilter = element.attribute( QStringLiteral( "horizontalTriangleFilter" ), QStringLiteral( "0" ) ).toInt(); mHorizontalTriangleFilterThreshold = element.attribute( QStringLiteral( "horizontalTriangleFilterThreshold" ), QStringLiteral( "5" ) ).toDouble(); mHorizontalTriangleFilterUnit = QgsUnitTypes::decodeRenderUnit( element.attribute( QStringLiteral( "horizontalTriangleFilterUnit" ), QStringLiteral( "MM" ) ) ); + + mShowLabels = element.attribute( QStringLiteral( "showLabels" ), QStringLiteral( "0" ) ).toInt(); + if ( !element.firstChildElement( QStringLiteral( "text-style" ) ).isNull() ) + { + mLabelTextFormat = QgsTextFormat(); + mLabelTextFormat.readXml( element.firstChildElement( QStringLiteral( "text-style" ) ), context ); + } } -void QgsPointCloudRenderer::saveCommonProperties( QDomElement &element, const QgsReadWriteContext & ) const +void QgsPointCloudRenderer::saveCommonProperties( QDomElement &element, const QgsReadWriteContext &context ) const { element.setAttribute( QStringLiteral( "pointSize" ), qgsDoubleToString( mPointSize ) ); element.setAttribute( QStringLiteral( "pointSizeUnit" ), QgsUnitTypes::encodeUnit( mPointSizeUnit ) ); @@ -239,6 +259,13 @@ void QgsPointCloudRenderer::saveCommonProperties( QDomElement &element, const Qg element.setAttribute( QStringLiteral( "horizontalTriangleFilter" ), QString::number( static_cast< int >( mHorizontalTriangleFilter ) ) ); element.setAttribute( QStringLiteral( "horizontalTriangleFilterThreshold" ), qgsDoubleToString( mHorizontalTriangleFilterThreshold ) ); element.setAttribute( QStringLiteral( "horizontalTriangleFilterUnit" ), QgsUnitTypes::encodeUnit( mHorizontalTriangleFilterUnit ) ); + + element.setAttribute( QStringLiteral( "showLabels" ), QString::number( mShowLabels ) ); + if ( mLabelTextFormat.isValid() ) + { + QDomDocument doc = element.ownerDocument(); + element.appendChild( mLabelTextFormat.writeXml( doc, context ) ); + } } Qgis::PointCloudSymbol QgsPointCloudRenderer::pointSymbol() const diff --git a/src/core/pointcloud/qgspointcloudrenderer.h b/src/core/pointcloud/qgspointcloudrenderer.h index 53861e6a693..f58db648996 100644 --- a/src/core/pointcloud/qgspointcloudrenderer.h +++ b/src/core/pointcloud/qgspointcloudrenderer.h @@ -24,6 +24,7 @@ #include "qgis_sip.h" #include "qgsvector3d.h" #include "qgspointcloudattribute.h" +#include "qgsstyle.h" class QgsPointCloudBlock; class QgsLayerTreeLayer; @@ -340,7 +341,7 @@ class CORE_EXPORT QgsPointCloudRenderer public: - QgsPointCloudRenderer() = default; + QgsPointCloudRenderer(); virtual ~QgsPointCloudRenderer() = default; @@ -675,6 +676,31 @@ class CORE_EXPORT QgsPointCloudRenderer */ virtual QStringList legendRuleKeys() const; + /** + * Set whether the renderer should also render file labels inside extent + * \since QGIS 3.42 + */ + void setShowLabels( const bool show ) { mShowLabels = show; } + + /** + * Returns whether the renderer shows file labels inside the extent + * rectangle + * \since QGIS 3.42 + */ + bool showLabels() const { return mShowLabels; } + + /** + * Sets the text format renderers should use for rendering labels + * \since QGIS 3.42 + */ + void setLabelTextFormat( const QgsTextFormat &textFormat ) { mLabelTextFormat = textFormat; } + + /** + * Returns the text format renderer is using for rendering labels + * \since QGIS 3.42 + */ + QgsTextFormat labelTextFormat() const { return mLabelTextFormat; } + protected: /** @@ -813,6 +839,9 @@ class CORE_EXPORT QgsPointCloudRenderer bool mHorizontalTriangleFilter = false; double mHorizontalTriangleFilterThreshold = 5.0; Qgis::RenderUnit mHorizontalTriangleFilterUnit = Qgis::RenderUnit::Millimeters; + + bool mShowLabels = false; + QgsTextFormat mLabelTextFormat; }; #endif // QGSPOINTCLOUDRENDERER_H diff --git a/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp b/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp index 21bd5d2e7f5..10cff78b983 100644 --- a/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp +++ b/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp @@ -16,19 +16,23 @@ #include "moc_qgspointcloudrendererpropertieswidget.cpp" #include "qgis.h" -#include "qgspointcloudrendererregistry.h" #include "qgsapplication.h" -#include "qgssymbolwidgetcontext.h" -#include "qgspointcloudrendererwidget.h" -#include "qgspointcloudlayer.h" -#include "qgspointcloudrenderer.h" -#include "qgspointcloudrgbrendererwidget.h" +#include "qgsfontbutton.h" +#include "qgslogger.h" #include "qgspointcloudattributebyramprendererwidget.h" #include "qgspointcloudclassifiedrendererwidget.h" +#include "qgspointcloudextentrenderer.h" #include "qgspointcloudextentrendererwidget.h" -#include "qgslogger.h" +#include "qgspointcloudlayer.h" +#include "qgspointcloudrenderer.h" +#include "qgspointcloudrendererregistry.h" +#include "qgspointcloudrendererwidget.h" +#include "qgspointcloudrgbrendererwidget.h" #include "qgsproject.h" #include "qgsprojectutils.h" +#include "qgsstyle.h" +#include "qgssymbolwidgetcontext.h" +#include "qgstextformatwidget.h" static bool initPointCloudRenderer( const QString &name, QgsPointCloudRendererWidgetFunc f, const QString &iconName = QString() ) { @@ -120,6 +124,14 @@ QgsPointCloudRendererPropertiesWidget::QgsPointCloudRendererPropertiesWidget( Qg connect( mHorizontalTriangleThresholdSpinBox, qOverload( &QgsDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged ); connect( mHorizontalTriangleUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged ); + // show label options only for virtual point clouds + bool showLabelOptions = !mLayer->dataProvider()->subIndexes().isEmpty(); + mLabels->setVisible( showLabelOptions ); + mLabelOptions->setVisible( showLabelOptions ); + mLabelOptions->setDialogTitle( tr( "Customize label text" ) ); + connect( mLabels, &QCheckBox::stateChanged, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged ); + connect( mLabelOptions, &QgsFontButton::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged ); + syncToLayer( layer ); } @@ -174,6 +186,12 @@ void QgsPointCloudRendererPropertiesWidget::syncToLayer( QgsMapLayer *layer ) mHorizontalTriangleCheckBox->setChecked( mLayer->renderer()->horizontalTriangleFilter() ); mHorizontalTriangleThresholdSpinBox->setValue( mLayer->renderer()->horizontalTriangleFilterThreshold() ); mHorizontalTriangleUnitWidget->setUnit( mLayer->renderer()->horizontalTriangleFilterUnit() ); + + if ( !mLayer->dataProvider()->subIndexes().isEmpty() ) + { + mLabels->setChecked( mLayer->renderer()->showLabels() ); + mLabelOptions->setTextFormat( mLayer->renderer()->labelTextFormat() ); + } } mBlockChangedSignal = false; @@ -213,6 +231,9 @@ void QgsPointCloudRendererPropertiesWidget::apply() mLayer->renderer()->setHorizontalTriangleFilter( mHorizontalTriangleCheckBox->isChecked() ); mLayer->renderer()->setHorizontalTriangleFilterThreshold( mHorizontalTriangleThresholdSpinBox->value() ); mLayer->renderer()->setHorizontalTriangleFilterUnit( mHorizontalTriangleUnitWidget->unit() ); + + mLayer->renderer()->setShowLabels( mLabels->isChecked() ); + mLayer->renderer()->setLabelTextFormat( mLabelOptions->textFormat() ); } void QgsPointCloudRendererPropertiesWidget::rendererChanged() diff --git a/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui b/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui index ecee9191aa0..b7886305121 100644 --- a/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui +++ b/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui @@ -13,288 +13,297 @@ Renderer Settings - - - 0 - - - 0 - - - 0 - - - 0 - + - - - 0 - - - 0 - - - 0 - - - 0 - + - + - + + + + + + + + + 4 + 0 + + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + - + + + This renderer doesn't implement a graphical interface. + + - - - - - - 4 - 0 - - - + + + + + + + Point Symbol + + + true + + + false + + + + 0 + + + 3 + + + + + 6 + + + 99999999999.000000000000000 + + + + + + + Style + + + + + + + + 0 + 0 + + + + Qt::StrongFocus + + + + + + + + + + Point size + + + + + + + + + + Render as a Surface (Triangulate) + + + true + + + false + + + + 0 + + + 3 + + + + + Skip triangles longer than + + + + + + + Maximum Triangle Side Size in Horizontal Plan + + + 6 + + + 99999999999.000000000000000 + + + + + + + + + + + + + Layer Rendering + + + true + + + false + + + + 0 + + + 3 + + + + + Maximum error + + + + + + + Blending mode + + + + + + + + 0 + 0 + + + + Qt::StrongFocus + + + + + - 0 + 4 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - This renderer doesn't implement a graphical interface. - - - - + + + + + Qt::StrongFocus + + + + + + + + 4 + 0 + + + + + + + + 6 + + + 99999999999.000000000000000 + + + 0.300000000000000 + + + + + + + Opacity + + + + + + + Draw order + + + + + + + + + + 6 + + + 6 + + + + + Show tile labels + - - - Point Symbol + + + Qt::Horizontal - - true + + + 40 + 20 + - - false - - - - 0 - - - 3 - - - - - 6 - - - 99999999999.000000000000000 - - - - - - - Style - - - - - - - - 0 - 0 - - - - Qt::StrongFocus - - - - - - - - - - Point size - - - - - + - - - Render as a Surface (Triangulate) + + + - - true - - - false - - - - 0 - - - 3 - - - - - Skip triangles longer than - - - - - - - Maximum Triangle Side Size in Horizontal Plan - - - 6 - - - 99999999999.000000000000000 - - - - - - - - - - - - - Layer Rendering - - - true - - - false - - - - 0 - - - 3 - - - - - Maximum error - - - - - - - Blending mode - - - - - - - - 0 - 0 - - - - Qt::StrongFocus - - - - - - - - 4 - 0 - - - - - - - - Qt::StrongFocus - - - - - - - - 4 - 0 - - - - - - - - 6 - - - 99999999999.000000000000000 - - - 0.300000000000000 - - - - - - - Opacity - - - - - - - Draw order - - - - @@ -340,6 +349,11 @@
qgscollapsiblegroupbox.h
1 + + QgsFontButton + QToolButton +
qgsfontbutton.h
+
cboRenderers