Je développe un module complémentaire pour QGIS qui doit attribuer un UUID à n'importe quelle fonctionnalité dès qu'il est ajouté à la couche. J'utilise le signal featureAdded pour écrire l'UUID dans le champ correspondant de la fonctionnalité.
Voici le code que j'utilise (aussi simplifié que possible):
def run(self):
self.iface.mapCanvas().currentLayer().featureAdded.connect(self.onFeatureAdded)
def onFeatureAdded(self, fid):
layer = self.iface.mapCanvas().currentLayer()
layer.beginEditCommand("Set UUID")
print layer.changeAttributeValue(fid, layer.fieldNameIndex('guid_pol'), 'some_random_uuid') # prints True
layer.endEditCommand()
(J'ai créé un nouveau plugin avec le module complémentaire 'Plugin Builder' et c'est ci-dessus le seul code que je lui ai ajouté .)
À moins que je manque quelque chose, cela suit les directives de la documentation dans le livre de cuisine du développeur QGIS : http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#modifying-vector-layers-with- un-tampon-d'édition
Lorsque j'édite le calque, si j'ajoute une fonction, le champ 'guid_pol' est réglé sur 'some_random_uuid' comme prévu. Cependant, je peux valider les modifications sans problème si, au lieu de valider les modifications, j'essaie de les annuler QGIS se bloque avec l'erreur 0xC0000005 (violation d'accès) .
Fait intéressant, la commande «Définir l'UUID» n'est pas ajoutée à la pile d'annulation / de rétablissement (du moins, pas au panneau Annuler / Rétablir ) et si j'essaye de l'annuler, elle se bloque également .
J'utilise QGIS 2.14 mais j'ai observé un comportement similaire avec QGIS 2.12.
J'ai du mal à faire fonctionner ça. Y a-t-il quelque chose que je fais mal?