Définition de l'attribut de fonctionnalité par nom via l'API python QGIS?

13

J'essaie de définir des attributs d'entité par nom d'attribut avec ce code

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

mais en résultat j'ai NULL dans tous les domaines. Si j'utilise

feature.setAttributes([1])

cela fonctionne correctement.

Ce que je fais mal? Pourquoi la fonctionnalité [attrName] = 1 ne fonctionne pas?

Mise à jour : Trouvez cette solution

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
la source

Réponses:

18

QGIS peut utiliser des noms de champs et des index:

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

Assurez-vous d'être en mode édition avant de faire quoi que ce soit sur le calque:

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

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

AFAIK, QGIS utilise des index de champ, pas des noms de champ, pour l'affectation. Essayez d'utiliser feature[layer.fieldNameIndex(attrName)] = 1.

Jan Šimbera
la source
J'essaie: feature.setAttribute(attrName, 1)et feature.setAttribute(layer.fieldNameIndex(attrName), 1)avec les mêmes résultats (la référence API a deux méthodes setAttribute pour la fonctionnalité avec index et nom)
dmitry.v.kiselev
feature[layer.fieldNameIndex(attrName)] = 1aussi la même chose.
dmitry.v.kiselev
Avez-vous initialisé les attributs ( feature.initAttributes(len(attributes)))?
Jan Šimbera
Ajoutez feature.initAttributes(1)avec le même résultat. Mais vérifiez feature[attrName]et j'ai obtenu 1 que je cherchais. Mais toujours NULL si j'ouvre la table d'attributs dans l'interface graphique.
dmitry.v.kiselev