Skip to content

Commit 6ecc69f

Browse files
committed
Add dataSourceChanged signal to QgsVectorLayer, add tests
1 parent 1c33261 commit 6ecc69f

File tree

4 files changed

+69
-0
lines changed

4 files changed

+69
-0
lines changed

python/core/auto_generated/qgsvectorlayer.sip.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,8 @@ if the geometry type of the new data source matches the current geometry type of
986986
:param loadDefaultStyleFlag: set to true to reset the layer's style to the default for the
987987
data source
988988

989+
.. seealso:: :py:func:`dataSourceChanged`
990+
989991
.. versionadded:: 3.2
990992
%End
991993

@@ -2295,6 +2297,15 @@ by the backend data provider).
22952297

22962298
signals:
22972299

2300+
void dataSourceChanged();
2301+
%Docstring
2302+
Emitted whenever the layer's data source has been changed.
2303+
2304+
.. seealso:: :py:func:`setDataSource`
2305+
2306+
.. versionadded:: 3.4
2307+
%End
2308+
22982309
void selectionChanged( const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect );
22992310
%Docstring
23002311
This signal is emitted when selection was changed

src/core/qgsvectorlayer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,10 @@ void QgsVectorLayer::setDataSource( const QString &dataSource, const QString &ba
14821482
setDataProvider( provider, options );
14831483

14841484
if ( !mValid )
1485+
{
1486+
emit dataSourceChanged();
14851487
return;
1488+
}
14861489

14871490
// Always set crs
14881491
setCoordinateSystem();
@@ -1520,6 +1523,7 @@ void QgsVectorLayer::setDataSource( const QString &dataSource, const QString &ba
15201523
setLegend( QgsMapLayerLegend::defaultVectorLegend( this ) );
15211524
}
15221525

1526+
emit dataSourceChanged();
15231527
emit repaintRequested();
15241528
}
15251529

src/core/qgsvectorlayer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,6 +964,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
964964
* \param options provider options
965965
* \param loadDefaultStyleFlag set to true to reset the layer's style to the default for the
966966
* data source
967+
* \see dataSourceChanged()
967968
* \since QGIS 3.2
968969
*/
969970
void setDataSource( const QString &dataSource, const QString &baseName, const QString &provider, const QgsDataProvider::ProviderOptions &options, bool loadDefaultStyleFlag = false );
@@ -2062,6 +2063,15 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
20622063

20632064
signals:
20642065

2066+
/**
2067+
* Emitted whenever the layer's data source has been changed.
2068+
*
2069+
* \see setDataSource()
2070+
*
2071+
* \since QGIS 3.4
2072+
*/
2073+
void dataSourceChanged();
2074+
20652075
/**
20662076
* This signal is emitted when selection was changed
20672077
*

tests/src/python/test_qgsvectorlayer.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
from qgis.core import (QgsWkbTypes,
2424
QgsAction,
25+
QgsDataProvider,
2526
QgsDefaultValue,
2627
QgsEditorWidgetSetup,
2728
QgsVectorLayer,
@@ -60,6 +61,7 @@
6061
from qgis.gui import (QgsAttributeTableModel,
6162
QgsGui
6263
)
64+
from qgis.PyQt.QtTest import QSignalSpy
6365
from qgis.testing import start_app, unittest
6466
from featuresourcetestbase import FeatureSourceTestCase
6567
from utilities import unitTestDataPath
@@ -292,6 +294,48 @@ def testUndoStack(self):
292294
self.assertEqual(layer.undoStack().index(), 2)
293295
self.assertEqual(layer.featureCount(), 4)
294296

297+
def testSetDataSource(self):
298+
"""
299+
Test changing a layer's data source
300+
"""
301+
layer = createLayerWithOnePoint()
302+
layer.setCrs(QgsCoordinateReferenceSystem("epsg:3111"))
303+
r = QgsSingleSymbolRenderer(QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry))
304+
layer.setRenderer(r)
305+
self.assertEqual(layer.renderer().symbol().type(), QgsSymbol.Marker)
306+
307+
spy = QSignalSpy(layer.dataSourceChanged)
308+
309+
options = QgsDataProvider.ProviderOptions()
310+
# change with layer of same type
311+
points_path = os.path.join(unitTestDataPath(), 'points.shp')
312+
layer.setDataSource(points_path, 'new name', 'ogr', options)
313+
314+
self.assertTrue(layer.isValid())
315+
self.assertEqual(layer.name(), 'new name')
316+
self.assertEqual(layer.wkbType(), QgsWkbTypes.Point)
317+
self.assertEqual(layer.crs().authid(), 'EPSG:4326')
318+
self.assertIn(points_path, layer.dataProvider().dataSourceUri())
319+
self.assertEqual(len(spy), 1)
320+
321+
# should have kept the same renderer!
322+
self.assertEqual(layer.renderer(), r)
323+
324+
# layer with different type
325+
lines_path = os.path.join(unitTestDataPath(), 'lines.shp')
326+
layer.setDataSource(lines_path, 'new name2', 'ogr', options)
327+
328+
self.assertTrue(layer.isValid())
329+
self.assertEqual(layer.name(), 'new name2')
330+
self.assertEqual(layer.wkbType(), QgsWkbTypes.MultiLineString)
331+
self.assertEqual(layer.crs().authid(), 'EPSG:4326')
332+
self.assertIn(lines_path, layer.dataProvider().dataSourceUri())
333+
self.assertEqual(len(spy), 2)
334+
335+
# should have reset renderer!
336+
self.assertNotEqual(layer.renderer(), r)
337+
self.assertEqual(layer.renderer().symbol().type(), QgsSymbol.Line)
338+
295339
# ADD FEATURE
296340

297341
def test_AddFeature(self):

0 commit comments

Comments
 (0)