diff --git a/src/core/project/qgsproject.cpp b/src/core/project/qgsproject.cpp index 11ad59fb906e..ec968cb0cfc5 100644 --- a/src/core/project/qgsproject.cpp +++ b/src/core/project/qgsproject.cpp @@ -2726,6 +2726,15 @@ void QgsProject::onMapLayersRemoved( const QList &layers ) if ( !mBlockSnappingUpdates && mSnappingConfig.removeLayers( layers ) ) emit snappingConfigChanged( mSnappingConfig ); + + for ( QgsMapLayer *layer : layers ) + { + QgsVectorLayer *vlayer = qobject_cast( layer ); + if ( ! vlayer ) + continue; + + mEditBufferGroup.removeLayer( vlayer ); + } } void QgsProject::cleanTransactionGroups( bool force ) diff --git a/src/core/vector/qgsvectorlayereditbuffergroup.cpp b/src/core/vector/qgsvectorlayereditbuffergroup.cpp index 739de41ae5db..26b9eca4be18 100644 --- a/src/core/vector/qgsvectorlayereditbuffergroup.cpp +++ b/src/core/vector/qgsvectorlayereditbuffergroup.cpp @@ -34,6 +34,11 @@ void QgsVectorLayerEditBufferGroup::addLayer( QgsVectorLayer *layer ) mLayers.insert( layer ); } +void QgsVectorLayerEditBufferGroup::removeLayer( QgsVectorLayer *layer ) +{ + mLayers.remove( layer ); +} + void QgsVectorLayerEditBufferGroup::clear() { mLayers.clear(); diff --git a/src/core/vector/qgsvectorlayereditbuffergroup.h b/src/core/vector/qgsvectorlayereditbuffergroup.h index 084fff984595..048d5df7114e 100644 --- a/src/core/vector/qgsvectorlayereditbuffergroup.h +++ b/src/core/vector/qgsvectorlayereditbuffergroup.h @@ -50,7 +50,14 @@ class CORE_EXPORT QgsVectorLayerEditBufferGroup : public QObject void addLayer( QgsVectorLayer *layer ); /** - * Remove all layers from this edit buffer group + * Remove a layer from this edit buffer group. + * + * \since QGIS 3.42 + */ + void removeLayer( QgsVectorLayer *layer ); + + /** + * Remove all layers from this edit buffer group. */ void clear(); diff --git a/tests/src/python/test_qgsvectorlayereditbuffergroup.py b/tests/src/python/test_qgsvectorlayereditbuffergroup.py index 34a0eca1c661..088d43fbf0c9 100644 --- a/tests/src/python/test_qgsvectorlayereditbuffergroup.py +++ b/tests/src/python/test_qgsvectorlayereditbuffergroup.py @@ -299,6 +299,34 @@ def testCircularRelations(self): self.assertTrue(success) self.assertFalse(editBufferGroup.isEditing()) + def testRemoveLayer(self): + memoryLayer_a = QgsVectorLayer( + "Point?crs=epsg:4326&field=id:integer&field=id_b", "testA", "memory" + ) + self.assertTrue(memoryLayer_a.isValid()) + + memoryLayer_b = QgsVectorLayer( + "Point?crs=epsg:4326&field=id:integer&field=id_a", "testB", "memory" + ) + self.assertTrue(memoryLayer_b.isValid()) + + project = QgsProject.instance() + project.addMapLayer(memoryLayer_a) + project.addMapLayer(memoryLayer_b) + + project.setTransactionMode(Qgis.TransactionMode.BufferedGroups) + + editBufferGroup = project.editBufferGroup() + + project.removeMapLayer(memoryLayer_a.id()) + + self.assertNotIn(memoryLayer_a, editBufferGroup.layers()) + self.assertIn(memoryLayer_b, editBufferGroup.layers()) + + # Chack that no crash happens (#59828) + project.startEditing() + project.commitChanges() + if __name__ == '__main__': unittest.main()