1

I'm writing a plugin and was really hoping to get the featureAdded signal when the user is interacting with a VectorLayer object in the plugin, but I never see that signal. To try and figure out what's going on, I created this standalone code that could run during QGIS startup. When I select a VectorLayer, I see that print, also edit start, edit end, and geom change. But I never see featureAdded or committedFeaturesAdded signals. I've tried the slots with and without @pyqtSlot decorators. I've tried this on 3.16.3 and 3.24.3 on Linux and 3.24.2 on Windows with the same results. What am I missing?

from qgis.core import QgsProject, QgsMapLayer
from qgis.utils import iface
from qgis.PyQt.QtCore import pyqtSlot

projConnect = False

@pyqtSlot(int)
def addedVertex(idx):
    print('new vertex id:', idx)

def addedFeatures(layerId, featureList):
    print(layerId, featureList)

def geomChange():
    print("geomChange")

def editStart():
    print("editStart")
    alayer = iface.activeLayer()
    alayer.featureAdded.connect(addedVertex)
    alayer.committedFeaturesAdded.connect(addedFeatures)
    alayer.geometryChanged.connect(geomChange)

def editStop():
    print("editStop")
    alayer = iface.activeLayer()
    alayer.featureAdded.disconnect()
    alayer.committedFeaturesAdded.disconnect()
    alayer.geometryChanged.disconnect()

def layerChanged(layer):
    if layer == None:
        return
    if layer.type() == QgsMapLayer.VectorLayer:
        print('layerChanged - is Vector layer')
        alayer = iface.activeLayer()
        alayer.editingStarted.connect(editStart)
        alayer.editingStopped.connect(editStop)

def projLoaded():
    global projConnect
    if projConnect == False:
        projConnect = True
        iface.currentLayerChanged.connect(layerChanged)

QgsProject.instance().readProject.connect(projLoaded)
0

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.