QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgscategorizedsymbolrenderer.h
Go to the documentation of this file.
1/***************************************************************************
2 qgscategorizedsymbolrenderer.h
3 ---------------------
4 begin : November 2009
5 copyright : (C) 2009 by Martin Dobias
6 email : wonder dot sk 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#ifndef QGSCATEGORIZEDSYMBOLRENDERER_H
16#define QGSCATEGORIZEDSYMBOLRENDERER_H
17
18#include "qgis_core.h"
19#include "qgis.h"
20#include "qgsrenderer.h"
21
22#include <QHash>
23
24class QgsVectorLayer;
25class QgsStyle;
27class QgsSymbol;
28class QgsExpression;
29class QgsColorRamp;
30
35class CORE_EXPORT QgsRendererCategory
36{
37 public:
38
43
55 QgsRendererCategory( const QVariant &value, QgsSymbol *symbol SIP_TRANSFER, const QString &label, bool render = true );
56
63
71 QVariant value() const;
72
77 QgsSymbol *symbol() const;
78
84 QString label() const;
85
93 void setValue( const QVariant &value );
94
102 void setSymbol( QgsSymbol *s SIP_TRANSFER );
103
109 void setLabel( const QString &label );
110
116 bool renderState() const;
117
123 void setRenderState( bool render );
124
125 // debugging
126
130 QString dump() const;
131
135 void toSld( QDomDocument &doc, QDomElement &element, QVariantMap props ) const;
136
137#ifdef SIP_RUN
138 SIP_PYOBJECT __repr__();
139 % MethodCode
140 const QString str = !sipCpp->value().isValid()
141 ? QStringLiteral( "<QgsRendererCategory>" )
142 : sipCpp->label().isEmpty()
143 ? QStringLiteral( "<QgsRendererCategory: %1>" ).arg( sipCpp->value().toString() )
144 : QStringLiteral( "<QgsRendererCategory: %1 (%2)>" ).arg( sipCpp->value().toString(), sipCpp->label() );
145 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
146 % End
147#endif
148
149 protected:
150 QVariant mValue;
151 std::unique_ptr<QgsSymbol> mSymbol;
152 QString mLabel;
153 bool mRender = true;
154
155 void swap( QgsRendererCategory &other );
156};
157
158typedef QList<QgsRendererCategory> QgsCategoryList;
159
165{
166 public:
167
176 QgsCategorizedSymbolRenderer( const QString &attrName = QString(), const QgsCategoryList &categories = QgsCategoryList() );
178
179 QgsSymbol *symbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
180 QgsSymbol *originalSymbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
181 void startRender( QgsRenderContext &context, const QgsFields &fields ) override;
182 void stopRender( QgsRenderContext &context ) override;
183 QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
184 bool filterNeedsGeometry() const override;
185 QString dump() const override;
186 QgsCategorizedSymbolRenderer *clone() const override SIP_FACTORY;
187 void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props = QVariantMap() ) const override;
188 QgsFeatureRenderer::Capabilities capabilities() override { return SymbolLevels | Filter; }
189 QString filter( const QgsFields &fields = QgsFields() ) override;
190 QgsSymbolList symbols( QgsRenderContext &context ) const override;
191 bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
192
199 void updateSymbols( QgsSymbol *sym );
200
204 const QgsCategoryList &categories() const { return mCategories; }
205
209 int categoryIndexForValue( const QVariant &val );
210
215 int categoryIndexForLabel( const QString &val );
216
226 bool updateCategoryValue( int catIndex, const QVariant &value );
227
237 bool updateCategorySymbol( int catIndex, QgsSymbol *symbol SIP_TRANSFER );
238
249 bool updateCategoryLabel( int catIndex, const QString &label );
250
263 bool updateCategoryRenderState( int catIndex, bool render );
264
270 void addCategory( const QgsRendererCategory &category );
271
277 bool deleteCategory( int catIndex );
278
284 void deleteAllCategories();
285
289 void moveCategory( int from, int to );
290
296 void sortByValue( Qt::SortOrder order = Qt::AscendingOrder );
297
303 void sortByLabel( Qt::SortOrder order = Qt::AscendingOrder );
304
312 QString classAttribute() const { return mAttrName; }
313
321 void setClassAttribute( const QString &attr ) { mAttrName = attr; }
322
326 static QgsFeatureRenderer *create( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
327
328 QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) override;
329 QgsLegendSymbolList legendSymbolItems() const override;
330 QSet< QString > legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
331 QString legendKeyToExpression( const QString &key, QgsVectorLayer *layer, bool &ok ) const override;
332
339 QgsSymbol *sourceSymbol();
340
348 const QgsSymbol *sourceSymbol() const SIP_SKIP;
349
357 void setSourceSymbol( QgsSymbol *sym SIP_TRANSFER );
358
364 QgsColorRamp *sourceColorRamp();
365
372 const QgsColorRamp *sourceColorRamp() const SIP_SKIP;
373
380 void setSourceColorRamp( QgsColorRamp *ramp SIP_TRANSFER );
381
387 void updateColorRamp( QgsColorRamp *ramp SIP_TRANSFER );
388
389 bool legendSymbolItemsCheckable() const override;
390 bool legendSymbolItemChecked( const QString &key ) override;
391 void setLegendSymbolItem( const QString &key, QgsSymbol *symbol SIP_TRANSFER ) override;
392 void checkLegendSymbolItem( const QString &key, bool state = true ) override;
393 QString legendClassificationAttribute() const override { return classAttribute(); }
394
403 static QgsCategorizedSymbolRenderer *convertFromRenderer( const QgsFeatureRenderer *renderer, QgsVectorLayer *layer = nullptr ) SIP_FACTORY;
404
415 void setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings SIP_TRANSFER );
416
422 QgsDataDefinedSizeLegend *dataDefinedSizeLegend() const;
423
441 int matchToSymbols( QgsStyle *style, Qgis::SymbolType type,
442 QVariantList &unmatchedCategories SIP_OUT, QStringList &unmatchedSymbols SIP_OUT, bool caseSensitive = true, bool useTolerantMatch = false );
443
444
455 static QgsCategoryList createCategories( const QVariantList &values, const QgsSymbol *symbol, QgsVectorLayer *layer = nullptr, const QString &fieldName = QString() );
456
466 static QString displayString( const QVariant &value, int precision = -1 );
467
468
469 protected:
470 QString mAttrName;
471 QgsCategoryList mCategories;
472 std::unique_ptr<QgsSymbol> mSourceSymbol;
473 std::unique_ptr<QgsColorRamp> mSourceColorRamp;
474 std::unique_ptr<QgsExpression> mExpression;
475
476 std::unique_ptr<QgsDataDefinedSizeLegend> mDataDefinedSizeLegend;
477
479 int mAttrNum = -1;
480
482 QHash<QString, QgsSymbol *> mSymbolHash;
483 bool mCounting = false;
484
485 void rebuildHash();
486
490 Q_DECL_DEPRECATED QgsSymbol *skipRender() SIP_DEPRECATED;
491
496 Q_DECL_DEPRECATED QgsSymbol *symbolForValue( const QVariant &value ) const SIP_DEPRECATED;
497
498 // TODO QGIS 4.0 - rename Python method to symbolForValue
499
513 QgsSymbol *symbolForValue( const QVariant &value, bool &foundMatchingSymbol SIP_OUT ) const SIP_PYNAME( symbolForValue2 );
514
515 private:
516#ifdef SIP_RUN
519#endif
520
522 QVariant valueForFeature( const QgsFeature &feature, QgsRenderContext &context ) const;
523
525 QgsLegendSymbolList baseLegendSymbolItems() const;
526
527};
528
529#endif // QGSCATEGORIZEDSYMBOLRENDERER_H
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:72
const QgsCategoryList & categories() const
Returns a list of all categories recognized by the renderer.
QString classAttribute() const
Returns the class attribute for the renderer, which is the field name or expression string from the l...
void setClassAttribute(const QString &attr)
Sets the class attribute for the renderer, which is the field name or expression string from the laye...
~QgsCategorizedSymbolRenderer() override
Abstract base class for color ramps.
Definition: qgscolorramp.h:30
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
Class for parsing and evaluation of expressions (formerly called "search strings").
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Container of fields for a vector layer.
Definition: qgsfields.h:45
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
Represents an individual category (class) from a QgsCategorizedSymbolRenderer.
std::unique_ptr< QgsSymbol > mSymbol
QgsRendererCategory()=default
Constructor for QgsRendererCategory.
An interface for classes which can visit style entity (e.g.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:93
Represents a vector layer which manages a vector based data sets.
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
Definition: qgsgeos.h:74
#define str(x)
Definition: qgis.cpp:37
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_PYNAME(name)
Definition: qgis_sip.h:81
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_FACTORY
Definition: qgis_sip.h:76
QList< QgsRendererCategory > QgsCategoryList
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QList< QgsSymbol * > QgsSymbolList
Definition: qgsrenderer.h:44
int precision