I'm trying to implement a function that would warn the user when he changes active layer and has just made changes on it that his changes have not been saved.
I found this forum: Prevent QGIS user to change layers without saving? Which inspired me. I tried to translate it to QGIS 3 (see the code below).
def check_edit():
layers = iface.editableLayers()
if layers:
layers = [layer for layer in QgsProject.instance().mapLayers().values()]
iface.setActiveLayer(layers[0])
iface.activeLayer()
iface.actionToggleEditing().trigger()
iface.currentLayerChanged.connect(check_edit)
But the result of it is not as expected because the changes are not saved. The changes appear, but the layer is not saved.
So I kept a little different code to which I added a pushMessage which warns the user which layer is concerned.
def check_edit():
layers = iface.editableLayers()
if layers:
iface.messageBar().pushMessage("Attention : ", "Couche "+ iface.activeLayer().name() + " en édition et non sauvegardée !", level=Qgis.Warning, duration=7)
iface.activeLayer()
iface.actionToggleEditing().trigger()
iface.currentLayerChanged.connect(check_edit)
I therefore do not find my code very efficient in the sense that the user is warned but these modifications are not saved.
So I would like to know if it is possible to display this pop-up (screenshot) which would leave the choice to the user to save or not his modifications?


startup.py, that's perfect. – hug117 May 28 '21 at 22:53I'm using qgis3.16
– FranckT Sep 23 '21 at 21:40startup.pyfile you should add the following imports (in the QGIS Python Console you don't need them):from qgis.PyQt.QtWidgets import QMessageBoxandfrom qgis.utils import iface. Let me know if now it works for you. – Germán Carrillo Sep 24 '21 at 01:13