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}})

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()

-1

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.