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, privacy policy and cookie policy

Browse other questions tagged or ask your own question.