Ich entwickle ein Addon für QGIS, das jedem Feature eine UUID zuweisen muss, sobald es der Ebene hinzugefügt wird. Ich verwende das Signal featureAdded, um die UUID in das entsprechende Feld des Features zu schreiben.
Dies ist der Code, den ich verwende (so vereinfacht wie möglich):
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()
(Ich habe ein neues Plugin mit dem Add-On 'Plugin Builder' erstellt und das oben ist der einzige Code, den ich hinzugefügt habe .)
Sofern mir nichts fehlt, folgt dies den Richtlinien aus der Dokumentation im QGIS-Entwicklerkochbuch : http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#modifying-vector-layers-with- ein-Bearbeitungspuffer
Wenn ich beim Bearbeiten der Ebene ein Feature hinzufüge, wird das Feld 'guid_pol' wie erwartet auf 'some_random_uuid' gesetzt. Ich kann die Änderungen jedoch problemlos festschreiben, wenn ich versuche, die Änderungen abzubrechen, anstatt sie festzuschreiben. QGIS stürzt mit dem Fehler 0xC0000005 (Zugriffsverletzung) ab .
Interessanterweise wird der Befehl 'Set UUID' nicht zum Undo / Redo-Stack hinzugefügt (zumindest nicht zum Undo / Redo-Panel ), und wenn ich versuche, ihn rückgängig zu machen , stürzt er ebenfalls ab .
Ich verwende QGIS 2.14, habe jedoch ein ähnliches Verhalten mit QGIS 2.12 beobachtet.
Es fällt mir schwer, das zum Laufen zu bringen. Gibt es etwas, was ich falsch mache?
quelle