32#include "moc_qgsauxiliarystorage.cpp"
34#define AS_JOINFIELD QStringLiteral( "ASPK" )
35#define AS_EXTENSION QStringLiteral( "qgd" )
36#define AS_JOINPREFIX QStringLiteral( "auxiliary_storage_" )
80 :
QgsVectorLayer( QStringLiteral(
"%1|layername=%2" ).arg( filename, table ),
81 QStringLiteral(
"%1_auxiliarystorage" ).arg( table ), QStringLiteral(
"ogr" ) )
82 , mFileName( filename )
88 mJoinInfo.setJoinLayer(
this );
90 mJoinInfo.setTargetFieldName( pkField );
91 mJoinInfo.setEditable(
true );
92 mJoinInfo.setUpsertOnEdit(
true );
93 mJoinInfo.setCascadedDelete(
true );
94 mJoinInfo.setJoinFieldNamesBlockList( QStringList() << QStringLiteral(
"rowid" ) );
100 return new QgsAuxiliaryLayer( mJoinInfo.targetFieldName(), mFileName, target->
id(), target );
115 const QString pkField = mJoinInfo.targetFieldName();
116 QgsFeature joinFeature;
117 QgsFeature targetFeature;
125 QgsFeatureRequest request;
128 mLayer->getFeatures( request ).nextFeature( targetFeature );
132 QgsFeature newFeature( joinFeature );
133 newFeature.setGeometry( targetFeature.
geometry() );
154 if ( ( definition.
name().isEmpty() && definition.
comment().isEmpty() ) ||
exists( definition ) )
160 mLayer->updateFields();
165 const int index = mLayer->fields().indexOf(
nameFromProperty( definition,
true ) );
167 if ( index >= 0 && auxIndex >= 0 )
172 const QgsEditorWidgetSetup setup = QgsEditorWidgetSetup( QStringLiteral(
"Hidden" ), QVariantMap() );
176 QgsAttributeTableConfig attrCfg = mLayer->attributeTableConfig();
177 attrCfg.
update( mLayer->fields() );
178 QVector<QgsAttributeTableConfig::ColumnConfig> columns = attrCfg.
columns();
179 QVector<QgsAttributeTableConfig::ColumnConfig>::iterator it;
181 for ( it = columns.begin(); it != columns.end(); ++it )
183 if ( it->name.compare( mLayer->fields().field( index ).name() ) == 0 )
188 mLayer->setAttributeTableConfig( attrCfg );
193 const QgsEditorWidgetSetup setup = QgsEditorWidgetSetup( QStringLiteral(
"Color" ), QVariantMap() );
251 for (
const QString &providerId : subProviderIds )
253 QgsPalLayerSettings *settings =
new QgsPalLayerSettings( layer->
labeling()->
settings( providerId ) );
258 const QgsProperty existingProperty =
c.
property( property );
262 || overwriteExisting )
265 c.setProperty( property, prop );
272 c.setProperty( property, prop );
302 const QgsProperty existingProperty =
c.property( property );
306 c.setProperty( property, prop );
313 c.setProperty( property, prop );
340 for (
const QString &providerId : subProviderIds )
342 QgsPalLayerSettings *settings =
new QgsPalLayerSettings( layer->
labeling()->
settings( providerId ) );
347 const QgsProperty existingProperty =
c.property( property );
351 c.setProperty( property, prop );
358 c.setProperty( property, prop );
377 if ( def.
origin().compare( QLatin1String(
"labeling" ) ) == 0 )
380 for (
const int p : palProps )
383 if ( propName.compare( def.
name() ) == 0 )
390 else if ( def.
origin().compare( QLatin1String(
"symbol" ) ) == 0 )
393 for (
int p : symbolProps )
396 if ( propName.compare( def.
name() ) == 0 )
412 if ( aDef.
origin().compare( QLatin1String(
"labeling" ) ) == 0 )
415 QgsPropertiesDefinition::const_iterator it = defs.constBegin();
416 for ( ; it != defs.constEnd(); ++it )
418 if ( it->name().compare( aDef.
name(), Qt::CaseInsensitive ) == 0 )
425 else if ( aDef.
origin().compare( QLatin1String(
"symbol" ) ) == 0 )
428 QgsPropertiesDefinition::const_iterator it = defs.constBegin();
429 for ( ; it != defs.constEnd(); ++it )
431 if ( it->name().compare( aDef.
name(), Qt::CaseInsensitive ) == 0 )
438 else if ( aDef.
origin().compare( QLatin1String(
"diagram" ) ) == 0 )
441 QgsPropertiesDefinition::const_iterator it = defs.constBegin();
442 for ( ; it != defs.constEnd(); ++it )
444 if ( it->name().compare( aDef.
name(), Qt::CaseInsensitive ) == 0 )
467 QString fieldName = def.
origin();
469 if ( !def.
name().isEmpty() )
470 fieldName = QStringLiteral(
"%1_%2" ).arg( fieldName, def.
name().toLower() );
472 if ( !def.
comment().isEmpty() )
473 fieldName = QStringLiteral(
"%1_%2" ).arg( fieldName, def.
comment() );
476 fieldName = QStringLiteral(
"%1%2" ).arg(
AS_JOINPREFIX, fieldName );
485 if ( !def.
name().isEmpty() || !def.
comment().isEmpty() )
487 QMetaType::Type
type = QMetaType::Type::UnknownType;
489 int len( 0 ), precision( 0 );
493 type = QMetaType::Type::QString;
495 typeName = QStringLiteral(
"String" );
498 type = QMetaType::Type::Double;
501 typeName = QStringLiteral(
"Real" );
504 type = QMetaType::Type::Int;
505 typeName = QStringLiteral(
"Integer" );
521 QgsPropertyDefinition def;
522 const QStringList parts = f.
name().split(
'_' );
524 if ( parts.size() <= 1 )
527 const QString origin = parts[0];
528 const QString propertyName = parts[1];
530 if ( origin.compare( QLatin1String(
"labeling" ), Qt::CaseInsensitive ) == 0 )
533 for (
auto it = props.constBegin(); it != props.constEnd(); ++it )
535 if ( it.value().name().compare( propertyName, Qt::CaseInsensitive ) == 0 )
538 if ( parts.size() >= 3 )
544 else if ( origin.compare( QLatin1String(
"symbol" ), Qt::CaseInsensitive ) == 0 )
547 for (
auto it = props.constBegin(); it != props.constEnd(); ++it )
549 if ( it.value().name().compare( propertyName, Qt::CaseInsensitive ) == 0 )
552 if ( parts.size() >= 3 )
558 else if ( origin.compare( QLatin1String(
"diagram" ), Qt::CaseInsensitive ) == 0 )
561 for (
auto it = props.constBegin(); it != props.constEnd(); ++it )
563 if ( it.value().name().compare( propertyName, Qt::CaseInsensitive ) == 0 )
566 if ( parts.size() >= 3 )
578 case QMetaType::Type::Double:
582 case QMetaType::Type::Bool:
586 case QMetaType::Type::QString:
592 if ( parts.size() >= 3 )
604 if ( !def.
name().isEmpty() || !def.
comment().isEmpty() )
624 mFileName = filenameForProject( project );
631 : mFileName( filename )
641 if ( QFile::exists( mTmpFileName ) )
642 QFile::remove( mTmpFileName );
657 if ( mFileName.isEmpty() )
664 if ( QFile::exists( mFileName ) )
665 QFile::remove( mFileName );
667 return QFile::copy( mTmpFileName, mFileName );
680 QgsAuxiliaryLayer *alayer =
nullptr;
682 if ( mValid && layer )
684 const QString table( layer->
id() );
685 sqlite3_database_unique_ptr database;
688 if ( !tableExists( table, database.get() ) )
690 if ( !createTable( field.
typeName(), table, database.get(), mErrorString ) )
706 const QgsDataSourceUri uri = parseOgrUri( ogrUri );
710 sqlite3_database_unique_ptr database;
711 database = openDB( uri.
database() );
715 QString sql = QStringLiteral(
"DROP TABLE %1" ).arg( uri.
table() );
716 rc = exec( sql, database.get() );
718 sql = QStringLiteral(
"VACUUM" );
719 rc = exec( sql, database.get() );
728 const QgsDataSourceUri uri = parseOgrUri( ogrUri );
733 sqlite3_database_unique_ptr database;
734 database = openDB( uri.
database() );
738 const QString sql = QStringLiteral(
"CREATE TABLE %1 AS SELECT * FROM %2" ).arg( newTable, uri.
table() );
739 rc = exec( sql, database.get() );
753 mErrorString.clear();
755 QFile dest( filename );
756 if ( dest.exists() && !dest.remove() )
758 mErrorString = dest.errorString();
763 if ( !origin.copy( filename ) )
765 mErrorString = origin.errorString();
774 return saveAs( filenameForProject( project ) );
784 const QFileInfo fileinfo( filenameForProject( project ) );
785 return fileinfo.exists() && fileinfo.isFile();
788bool QgsAuxiliaryStorage::exec(
const QString &sql,
sqlite3 *handler )
794 const int err = sqlite3_exec( handler, sql.toStdString().c_str(),
nullptr,
nullptr,
nullptr );
796 if ( err == SQLITE_OK )
799 debugMsg( sql, handler );
805QString QgsAuxiliaryStorage::debugMsg(
const QString &sql,
sqlite3 *handler )
807 const QString err = QString::fromUtf8( sqlite3_errmsg( handler ) );
808 const QString msg = QObject::tr(
"Unable to execute" );
809 const QString errMsg = QObject::tr(
"%1 '%2': %3" ).arg( msg, sql, err );
814bool QgsAuxiliaryStorage::createTable(
const QString &type,
const QString &table,
sqlite3 *handler, QString &errorMsg )
816 const QString sql = QStringLiteral(
"CREATE TABLE IF NOT EXISTS '%1' ( '%2' %3 )" ).arg( table,
AS_JOINFIELD, type );
818 if ( !exec( sql, handler ) )
820 errorMsg = QgsAuxiliaryStorage::debugMsg( sql, handler );
829 sqlite3_database_unique_ptr database;
832 rc = database.
open_v2( filename, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
nullptr );
835 debugMsg( QStringLiteral(
"sqlite3_open_v2" ), database.get() );
839 exec( QStringLiteral(
"PRAGMA foreign_keys = 1" ), database.get() );
846 sqlite3_database_unique_ptr database;
847 const int rc = database.
open_v2( filename, SQLITE_OPEN_READWRITE,
nullptr );
851 debugMsg( QStringLiteral(
"sqlite3_open_v2" ), database.get() );
857bool QgsAuxiliaryStorage::tableExists(
const QString &table,
sqlite3 *handler )
859 const QString sql = QStringLiteral(
"SELECT 1 FROM sqlite_master WHERE type='table' AND name='%1'" ).arg( table );
862 char **results =
nullptr;
863 const int rc = sqlite3_get_table( handler, sql.toStdString().c_str(), &results, &rows, &columns,
nullptr );
864 if ( rc != SQLITE_OK )
866 debugMsg( sql, handler );
870 sqlite3_free_table( results );
879 sqlite3_database_unique_ptr database;
881 if ( filename.isEmpty() )
886 else if ( QFile::exists( filename ) )
889 QFile::copy( filename, mTmpFileName );
905 return open( filenameForProject( project ) );
908QString QgsAuxiliaryStorage::filenameForProject(
const QgsProject &project )
911 const QString path = info.path() + QDir::separator() + info.baseName();
915void QgsAuxiliaryStorage::initTmpFileName()
917 QTemporaryFile tmpFile;
918 if ( !tmpFile.open() )
920 QgsDebugError( QStringLiteral(
"Can't open temporary file" ) );
924 mTmpFileName = tmpFile.fileName();
929 if ( mCopy || mFileName.isEmpty() )
937 QgsDataSourceUri newUri;
941 QStringList uriParts = uri.
uri().split(
'|' );
942 if ( uriParts.count() < 2 )
945 const QString databasePath = uriParts[0].replace(
' ', QString() );
947 const QString table = uriParts[1];
948 QStringList tableParts = table.split(
' ' );
950 if ( tableParts.count() < 1 )
953 const QString tableName = tableParts[0].replace( QLatin1String(
"layername=" ), QString() );
@ Invalid
Invalid (not set) property.
@ Field
Field based property.
@ Expression
Expression based property.
virtual QStringList subProviders() const
Gets list of sub-providers within the layer's labeling.
virtual void setSettings(QgsPalLayerSettings *settings, const QString &providerId=QString())=0
Set pal settings for a specific provider (takes ownership).
virtual QgsPalLayerSettings settings(const QString &providerId=QString()) const =0
Gets associated label settings.
QVector< QgsAttributeTableConfig::ColumnConfig > columns() const
Gets the list with all columns and their configuration.
void update(const QgsFields &fields)
Update the configuration with the given fields.
void setColumns(const QVector< QgsAttributeTableConfig::ColumnConfig > &columns)
Set the list of columns visible in the attribute table.
Allows managing the auxiliary storage for a vector layer.
static QString nameFromProperty(const QgsPropertyDefinition &def, bool joined=false)
Returns the name of the auxiliary field for a property definition.
static QgsField createAuxiliaryField(const QgsPropertyDefinition &definition)
Creates a new auxiliary field from a property definition.
static QgsPropertyDefinition propertyDefinitionFromField(const QgsField &field)
Returns the property definition from an auxiliary field.
bool clear()
Deletes all features from the layer.
bool addAuxiliaryField(const QgsPropertyDefinition &definition)
Adds an auxiliary field for the given property.
bool isHiddenProperty(int index) const
Returns true if the underlying field has to be hidden from editing tools like attribute table,...
QgsVectorLayer * toSpatialLayer() const
An auxiliary layer is not spatial.
bool deleteAttribute(int attr) override
Removes attribute from the layer and commits changes.
QgsFields auxiliaryFields() const
Returns a list of all auxiliary fields currently managed by the layer.
QgsAuxiliaryLayer(const QString &pkField, const QString &filename, const QString &table, QgsVectorLayer *vlayer)
Constructor.
bool save()
Commits changes and starts editing then.
int propertyFromIndex(int index) const
Returns the underlying property key for the field index.
QgsVectorLayerJoinInfo joinInfo() const
Returns information to use for joining with primary key and so on.
QgsVectorLayer * clone() const override
Returns a new instance equivalent to this one.
QgsPropertyDefinition propertyDefinitionFromIndex(int index) const
Returns the property definition for the underlying field index.
bool exists(const QgsPropertyDefinition &definition) const
Returns true if the property is stored in the layer already, false otherwise.
static int createProperty(QgsPalLayerSettings::Property property, QgsVectorLayer *vlayer, bool overwriteExisting=true)
Creates if necessary a new auxiliary field for a PAL property and activates this property in settings...
int indexOfPropertyDefinition(const QgsPropertyDefinition &definition) const
Returns the index of the auxiliary field for a specific property definition.
static QString extension()
Returns the extension used for auxiliary databases.
QString errorString() const
Returns the underlying error string describing potential errors happening in saveAs().
bool save() const
Saves the current database.
static bool exists(const QgsProject &project)
Returns true if the auxiliary database yet exists for a project, false otherwise.
QgsAuxiliaryLayer * createAuxiliaryLayer(const QgsField &field, QgsVectorLayer *layer) const
Creates an auxiliary layer for a vector layer.
virtual ~QgsAuxiliaryStorage()
bool saveAs(const QString &filename)
Saves the current database to a new path.
bool isValid() const
Returns the status of the auxiliary storage currently defined.
QString currentFileName() const
Returns the path of the current database used.
QgsAuxiliaryStorage(const QgsProject &project, bool copy=true)
Constructor.
QString fileName() const
Returns the target filename of the database.
static bool deleteTable(const QgsDataSourceUri &uri)
Removes a table from the auxiliary storage.
static bool duplicateTable(const QgsDataSourceUri &uri, const QString &newTable)
Duplicates a table and its content.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the callout's property collection, used for data defined overrides.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the callout's property collection, used for data defined overrides.
static QgsPropertiesDefinition propertyDefinitions()
Returns the definitions for data defined properties available for use in callouts.
Property
Data definable properties.
Stores the component parts of a data source URI (e.g.
QString table() const
Returns the table name stored in the URI.
QString uri(bool expandAuthConfig=true) const
Returns the complete URI as a string.
void setDataSource(const QString &aSchema, const QString &aTable, const QString &aGeometryColumn, const QString &aSql=QString(), const QString &aKeyColumn=QString())
Sets all data source related members at once.
QString database() const
Returns the database name stored in the URI.
void setDatabase(const QString &database)
Sets the URI database name.
Property
Data definable properties.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the diagram property definitions.
static QString createFieldEqualityExpression(const QString &fieldName, const QVariant &value, QMetaType::Type fieldType=QMetaType::Type::UnknownType)
Create an expression allowing to evaluate if a field is equal to a value.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes).
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
virtual QgsFeatureIds allFeatureIds() const
Returns a list of all feature IDs for features present in the source.
bool isValid() const
Returns the validity of this feature.
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Encapsulate a field in an attribute table or data source.
QString typeName() const
Gets the field type.
void setPrecision(int precision)
Set the field precision.
void setName(const QString &name)
Set the field name.
void setType(QMetaType::Type type)
Set variant type.
void setLength(int len)
Set the field length.
void setTypeName(const QString &typeName)
Set the field type.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
Q_INVOKABLE int indexOf(const QString &fieldName) const
Gets the field index from the field name.
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
QString source() const
Returns the source for the layer.
friend class QgsVectorLayer
static QgsVectorLayer * createMemoryLayer(const QString &name, const QgsFields &fields, Qgis::WkbType geometryType=Qgis::WkbType::NoGeometry, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem(), bool loadDefaultStyle=true) SIP_FACTORY
Creates a new memory layer using the specified parameters.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
QgsCallout * callout() const
Returns the label callout renderer, responsible for drawing label callouts.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the label's property collection, used for data defined overrides.
Property
Data definable properties.
@ PositionX
X-coordinate data defined label position.
@ MinScale
Min scale (deprecated, for old project compatibility only).
@ LabelRotation
Label rotation.
@ FontStyle
Font style name.
@ Italic
Use italic style.
@ PositionY
Y-coordinate data defined label position.
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top).
@ MaxScale
Max scale (deprecated, for old project compatibility only).
@ Strikeout
Use strikeout.
@ LabelAllParts
Whether all parts of multi-part features should be labeled.
@ Underline
Use underline.
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right).
@ CalloutDraw
Show callout.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
QString absoluteFilePath() const
Returns full absolute path to the project file if the project is stored in a file system - derived fr...
QgsProperty property(int key) const final
Returns a matching property from the collection, if one exists.
Definition for a property.
StandardPropertyTemplate standardTemplate() const
Returns the property's standard template, if applicable.
QString comment() const
Returns the comment of the property.
DataType dataType() const
Returns the allowable field/value data type for the property.
void setOrigin(const QString &origin)
Sets the origin of the property.
@ ColorNoAlpha
Color with no alpha channel.
@ ColorWithAlpha
Color with alpha channel.
QString name() const
Returns the name of the property.
void setDataType(DataType type)
Sets the data type.
void setName(const QString &name)
Sets the name of the property.
QString origin() const
Returns the origin of the property.
void setComment(const QString &comment)
Sets comment of the property.
@ DataTypeString
Property requires a string value.
@ DataTypeBoolean
Property requires a boolean value.
@ DataTypeNumeric
Property requires a numeric value.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
QString expressionString() const
Returns the expression used for the property value.
Qgis::PropertyType propertyType() const
Returns the property type.
QString field() const
Returns the current field name the property references.
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol layer property definitions.
Defines left outer join from our vector layer to some other vector layer.
Represents a vector layer which manages a vector based dataset.
bool isEditable() const final
Returns true if the provider is in editing mode.
Q_INVOKABLE bool deleteFeatures(const QgsFeatureIds &fids, QgsVectorLayer::DeleteContext *context=nullptr)
Deletes a set of features from the layer (but does not commit it).
Q_INVOKABLE bool startEditing()
Makes the layer editable.
Q_INVOKABLE bool addAttribute(const QgsField &field)
Add an attribute field (but does not commit it) returns true if the field was added.
void updateFields()
Will regenerate the fields property of this layer by obtaining all fields from the dataProvider,...
const QgsDiagramLayerSettings * diagramLayerSettings() const
QgsAuxiliaryLayer * auxiliaryLayer()
Returns the current auxiliary layer.
const QgsAbstractVectorLayerLabeling * labeling() const
Access to const labeling configuration.
virtual Q_INVOKABLE bool deleteAttribute(int attr)
Deletes an attribute field (but does not commit it).
void setEditorWidgetSetup(int index, const QgsEditorWidgetSetup &setup)
Sets the editor widget setup for the field at the specified index.
Q_INVOKABLE bool commitChanges(bool stopEditing=true)
Attempts to commit to the underlying data provider any buffered changes made since the last to call t...
QgsEditorWidgetSetup editorWidgetSetup(int index) const
Returns the editor widget setup for the field at the specified index.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
void setDiagramLayerSettings(const QgsDiagramLayerSettings &s)
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) final
Adds a single feature to the sink.
Unique pointer for sqlite3 databases, which automatically closes the database when the pointer goes o...
int open_v2(const QString &path, int flags, const char *zVfs)
Opens the database at the specified file path.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
Q_GLOBAL_STATIC_WITH_ARGS(PalPropertyList, palHiddenProperties,({ static_cast< int >(QgsPalLayerSettings::Property::PositionX), static_cast< int >(QgsPalLayerSettings::Property::PositionY), static_cast< int >(QgsPalLayerSettings::Property::Show), static_cast< int >(QgsPalLayerSettings::Property::LabelRotation), static_cast< int >(QgsPalLayerSettings::Property::Family), static_cast< int >(QgsPalLayerSettings::Property::FontStyle), static_cast< int >(QgsPalLayerSettings::Property::Size), static_cast< int >(QgsPalLayerSettings::Property::Bold), static_cast< int >(QgsPalLayerSettings::Property::Italic), static_cast< int >(QgsPalLayerSettings::Property::Underline), static_cast< int >(QgsPalLayerSettings::Property::Color), static_cast< int >(QgsPalLayerSettings::Property::Strikeout), static_cast< int >(QgsPalLayerSettings::Property::MultiLineAlignment), static_cast< int >(QgsPalLayerSettings::Property::BufferSize), static_cast< int >(QgsPalLayerSettings::Property::BufferDraw), static_cast< int >(QgsPalLayerSettings::Property::BufferColor), static_cast< int >(QgsPalLayerSettings::Property::LabelDistance), static_cast< int >(QgsPalLayerSettings::Property::Hali), static_cast< int >(QgsPalLayerSettings::Property::Vali), static_cast< int >(QgsPalLayerSettings::Property::ScaleVisibility), static_cast< int >(QgsPalLayerSettings::Property::MinScale), static_cast< int >(QgsPalLayerSettings::Property::MaxScale), static_cast< int >(QgsPalLayerSettings::Property::AlwaysShow), static_cast< int >(QgsPalLayerSettings::Property::CalloutDraw), static_cast< int >(QgsPalLayerSettings::Property::LabelAllParts) })) Q_GLOBAL_STATIC_WITH_ARGS(SymbolPropertyList
QVector< int > SymbolPropertyList
QVector< int > PalPropertyList
#define QgsDebugError(str)
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.