QGIS API Documentation 4.1.0-Master (3b8ef1f72a3)
Loading...
Searching...
No Matches
qgssymbolconverterqml.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssymbolconverterqml.cpp
3 ----------------------
4 begin : February 2026
5 copyright : (C) 2026 by Nyall Dawson
6 email : nyall dot dawson 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
17
18#include "qgsreadwritecontext.h"
19#include "qgssymbol.h"
20#include "qgssymbollayerutils.h"
21
22#include <QDomDocument>
23#include <QDomElement>
24#include <QObject>
25#include <QString>
26#include <QVariant>
27
28using namespace Qt::StringLiterals;
29
34
36{
37 return u"qml"_s;
38}
39
41{
42 return QObject::tr( "QGIS QML Style" );
43}
44
46{
47 if ( !symbol )
48 return QVariant();
49
50 QDomImplementation DomImplementation;
51 const QDomDocumentType documentType = DomImplementation.createDocumentType( u"qgis"_s, u"http://mrcc.com/qgis.dtd"_s, u"SYSTEM"_s );
52 QDomDocument doc( documentType );
53
54 QDomElement symbolElem = QgsSymbolLayerUtils::saveSymbol( u"symbol"_s, symbol, doc, context.readWriteContext() );
55
56 if ( symbolElem.isNull() )
57 return QVariant();
58
59 doc.appendChild( symbolElem );
60 return doc.toString();
61}
62
63std::unique_ptr< QgsSymbol > QgsSymbolConverterQml::createSymbol( const QVariant &variant, QgsSymbolConverterContext &context ) const
64{
65 const QString xmlString = variant.toString();
66 if ( xmlString.isEmpty() )
67 return nullptr;
68
69 QDomDocument doc;
70 QString errorMsg;
71 int errorLine, errorColumn;
72 if ( !doc.setContent( xmlString, &errorMsg, &errorLine, &errorColumn ) )
73 {
74 context.pushError( QObject::tr( "Error parsing QML content: %1" ).arg( errorMsg ) );
75 return nullptr;
76 }
77
78 QDomElement root = doc.documentElement();
79 if ( root.isNull() )
80 {
81 context.pushError( QObject::tr( "QML document is empty" ) );
82 return nullptr;
83 }
84
85 return QgsSymbolLayerUtils::loadSymbol( root, context.readWriteContext() );
86}
QFlags< SymbolConverterCapability > SymbolConverterCapabilities
Symbol converter capabilities.
Definition qgis.h:824
@ WriteSymbol
Allows writing symbols to variants.
Definition qgis.h:814
@ ReadSymbol
Allows reading symbols from variants.
Definition qgis.h:813
Represents the context in which a QgsSymbolConverter conversion occurs.
QgsReadWriteContext & readWriteContext()
Returns the read-write context associated with the context.
void pushError(const QString &error)
Pushes a error message generated during the conversion.
std::unique_ptr< QgsSymbol > createSymbol(const QVariant &variant, QgsSymbolConverterContext &context) const override
Creates a new QgsSymbol from a QVariant representation.
QString formatName() const override
Returns a translated, user-friendly name for the converter's data format.
QString name() const override
Returns the unique name for the converter.
Qgis::SymbolConverterCapabilities capabilities() const override
Returns the capabilities of the converter.
QVariant toVariant(const QgsSymbol *symbol, QgsSymbolConverterContext &context) const override
Converts a symbol into a QVariant representation.
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:227