Festlegen des Feature-Attributs nach Namen über die QGIS-Python-API?

13

Ich versuche, Feature-Attribute anhand des Attributnamens mit diesem Code festzulegen

pr = layer.dataProvider()
pr.addAttributes([QgsField("test", QVariant.Int)])
layer.updateFields()
for feature in layer.getFeatures():
 attrName = 'test'
 feature[attrName] = 1

aber im Ergebnis habe ich NULL in allen Feldern. Wenn ich benutze

feature.setAttributes([1])

es funktioniert richtig.

Was ich falsch mache? Warum funktioniert die Funktion [attrName] = 1 nicht?

Update : Finden Sie diese Lösung

pr = layer.dataProvider()
pr.addAttributes([QgsField("test", QVariant.Int)])
layer.updateFields()
for feature in layer.getFeatures():
 attrName = 'test'
 feature[attrName] = 1
 pr.changeAttributeValues({feature.id() : {pr.fieldNameMap()[attrName] : 1}})
dmitry.v.kiselev
quelle

Antworten:

17

QGIS kann Feldnamen und Indizes verwenden:

feature['fieldname'] = 10
feature[1] = 10

Stellen Sie sicher, dass Sie sich im Bearbeitungsmodus befinden, bevor Sie etwas auf der Ebene tun:

layer.startEditing()
feature['fieldname'] = 10
layer.updateFeature(feature)

#Call commit to save the changes
layer.commitChanges()
Nathan W.
quelle
-1

AFAIK, QGIS verwendet für die Zuweisung Feldindizes und keine Feldnamen. Versuchen Sie es mit feature[layer.fieldNameIndex(attrName)] = 1.

Jan Šimbera
quelle
Ich versuche: feature.setAttribute(attrName, 1)und feature.setAttribute(layer.fieldNameIndex(attrName), 1)mit den gleichen Ergebnissen (API-Referenz haben zwei setAttribute-Methoden für Feature mit Index und Name)
dmitry.v.kiselev
feature[layer.fieldNameIndex(attrName)] = 1auch das gleiche.
dmitry.v.kiselev
Haben Sie die Attribute ( feature.initAttributes(len(attributes))) initialisiert ?
Jan Šimbera
feature.initAttributes(1)Mit dem gleichen Ergebnis hinzufügen . Aber überprüfe feature[attrName]und habe 1, nach der ich suche. Habe aber immer noch NULL, wenn ich die Attributtabelle in GUI öffne.
dmitry.v.kiselev