Skip to content

Commit 9ac3312

Browse files
committed
Fix crash when writing CRS to XML using QgsXmlUtils
Fixes a crash when saving a processing model using a CRS input
1 parent 9503ffa commit 9ac3312

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

src/core/qgsapplication.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ void QgsApplication::init( QString profileFolder )
199199
qRegisterMetaType<QgsReferencedPointXY>( "QgsReferencedPointXY" );
200200
qRegisterMetaType<QgsLayoutRenderContext::Flags>( "QgsLayoutRenderContext::Flags" );
201201
qRegisterMetaType<QgsStyle::StyleEntity>( "QgsStyle::StyleEntity" );
202+
qRegisterMetaType<QgsCoordinateReferenceSystem>( "QgsCoordinateReferenceSystem" );
202203

203204
QString prefixPath( getenv( "QGIS_PREFIX_PATH" ) ? getenv( "QGIS_PREFIX_PATH" ) : applicationDirPath() );
204205
// QgsDebugMsg( QString( "prefixPath(): %1" ).arg( prefixPath ) );

src/core/qgsxmlutils.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,13 @@ QDomElement QgsXmlUtils::writeVariant( const QVariant &value, QDomDocument &doc
168168
element.appendChild( propertyElem );
169169
break;
170170
}
171+
else if ( value.canConvert< QgsCoordinateReferenceSystem >() )
172+
{
173+
element.setAttribute( QStringLiteral( "type" ), QStringLiteral( "QgsCoordinateReferenceSystem" ) );
174+
const QgsCoordinateReferenceSystem crs = value.value< QgsCoordinateReferenceSystem >();
175+
crs.writeXml( element, doc );
176+
break;
177+
}
171178
FALLTHROUGH
172179
}
173180

@@ -250,6 +257,12 @@ QVariant QgsXmlUtils::readVariant( const QDomElement &element )
250257

251258
return QVariant();
252259
}
260+
else if ( type == QLatin1String( "QgsCoordinateReferenceSystem" ) )
261+
{
262+
QgsCoordinateReferenceSystem crs;
263+
crs.readXml( element );
264+
return crs;
265+
}
253266
else
254267
{
255268
return QVariant();

tests/src/python/test_qgsxmlutils.py

+21-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
import qgis # NOQA switch sip api
1616

1717
from qgis.core import (QgsXmlUtils,
18-
QgsProperty)
18+
QgsProperty,
19+
QgsCoordinateReferenceSystem)
1920

2021
from qgis.PyQt.QtXml import QDomDocument
2122

2223
from qgis.testing import start_app, unittest
2324

24-
2525
start_app()
2626

2727

@@ -141,6 +141,25 @@ def test_property(self):
141141

142142
self.assertEqual(prop, prop2)
143143

144+
def test_crs(self):
145+
"""
146+
Test that QgsCoordinateReferenceSystem values are correctly loaded and written
147+
"""
148+
doc = QDomDocument("properties")
149+
150+
crs = QgsCoordinateReferenceSystem('epsg:3111')
151+
elem = QgsXmlUtils.writeVariant(crs, doc)
152+
153+
crs2 = QgsXmlUtils.readVariant(elem)
154+
self.assertTrue(crs2.isValid())
155+
self.assertEqual(crs2.authid(), 'EPSG:3111')
156+
157+
crs = QgsCoordinateReferenceSystem()
158+
elem = QgsXmlUtils.writeVariant(crs, doc)
159+
160+
crs2 = QgsXmlUtils.readVariant(elem)
161+
self.assertFalse(crs2.isValid())
162+
144163

145164
if __name__ == '__main__':
146165
unittest.main()

0 commit comments

Comments
 (0)