Skip to content

Commit 9dd6c0a

Browse files
committed
Merge pull request #2683 from SebDieBln/FixNonVectorQLR
[Regression] make QLR files containing non-vector layers work again (fixes #14091)
2 parents 1cd4570 + 52442f5 commit 9dd6c0a

File tree

4 files changed

+346
-10
lines changed

4 files changed

+346
-10
lines changed

src/core/qgslayerdefinition.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,11 @@ bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsLayerTreeGrou
6666
clonedSorted << node.cloneNode();
6767
}
6868
QDomNode layersNode = doc.elementsByTagName( "maplayers" ).at( 0 );
69-
// remove old children
69+
// replace old children with new ones
7070
QDomNodeList childNodes = layersNode.childNodes();
7171
for ( int i = 0; i < childNodes.size(); i++ )
7272
{
73-
layersNode.removeChild( childNodes.at( i ) );
74-
}
75-
// replace with new ones
76-
foreach ( QDomNode node, clonedSorted )
77-
{
78-
layersNode.appendChild( node );
73+
layersNode.replaceChild( clonedSorted.at( i ), childNodes.at( i ) );
7974
}
8075
}
8176
// if a dependency is missing, we still try to load layers, since dependencies may already be loaded
@@ -131,7 +126,7 @@ bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsLayerTreeGrou
131126
// Now that all layers are loaded, refresh the vectorjoins to get the joined fields
132127
Q_FOREACH ( QgsMapLayer* layer, layers )
133128
{
134-
QgsVectorLayer* vlayer = static_cast< QgsVectorLayer * >( layer );
129+
QgsVectorLayer* vlayer = dynamic_cast< QgsVectorLayer * >( layer );
135130
if ( vlayer )
136131
{
137132
vlayer->createJoinCaches();

tests/src/core/testqgsvectorlayerjoinbuffer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ void TestVectorLayerJoinBuffer::testJoinLayerDefinitionFile()
384384
QList<QgsMapLayer*> mapLayers = QgsMapLayerRegistry::instance()->mapLayersByName( "layerB" );
385385
QCOMPARE( mapLayers.count(), 1 );
386386

387-
QgsVectorLayer* vLayer = static_cast<QgsVectorLayer*>( mapLayers.value( 0 ) );
387+
QgsVectorLayer* vLayer = dynamic_cast<QgsVectorLayer*>( mapLayers.value( 0 ) );
388388
QVERIFY( vLayer );
389389

390390
// Check for vector join

tests/src/python/test_qgslayerdefinition.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@
1515
import qgis
1616

1717
from qgis.core import (QGis,
18+
QgsProject,
19+
QgsMapLayerRegistry,
1820
QgsLayerDefinition
1921
)
2022

21-
from utilities import (TestCase, unittest)
23+
from utilities import (TestCase, unittest, getQgisTestApp, unitTestDataPath)
2224

2325
from PyQt4.QtCore import QVariant
2426
from PyQt4.QtXml import QDomDocument
2527

28+
QGISAPP, CANVAS, IFACE, PARENT = getQgisTestApp()
29+
TEST_DATA_DIR = unitTestDataPath()
30+
2631

2732
class TestQgsLayerDefinition(TestCase):
2833

@@ -93,5 +98,18 @@ def testCyclicDependency(self):
9398
nodes = dep.sortedLayerNodes()
9499
self.assertTrue(dep.hasCycle())
95100

101+
def testVectorAndRaster(self):
102+
# Load a simple QLR containing a vector layer and a raster layer.
103+
QgsMapLayerRegistry.instance().removeAllMapLayers()
104+
layers = QgsMapLayerRegistry.instance().mapLayers()
105+
self.assertEqual(len(layers), 0)
106+
107+
(result, errMsg) = QgsLayerDefinition.loadLayerDefinition(TEST_DATA_DIR + '/vector_and_raster.qlr', QgsProject.instance().layerTreeRoot())
108+
self.assertTrue(result)
109+
110+
layers = QgsMapLayerRegistry.instance().mapLayers()
111+
self.assertEqual(len(layers), 2)
112+
QgsMapLayerRegistry.instance().removeAllMapLayers()
113+
96114
if __name__ == '__main__':
97115
unittest.main()

0 commit comments

Comments
 (0)