Definindo o atributo do recurso pelo nome via QGIS python api?

13

Eu tento definir atributos de recurso pelo nome do atributo com este código

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

mas, como resultado, tenho NULL em todos os campos. Se eu usar

feature.setAttributes([1])

funciona corretamente.

O que eu faço de errado? Por que o recurso [attrName] = 1 não funciona?

Atualização : Encontre esta solução

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
fonte

Respostas:

17

O QGIS pode usar nomes e índices de campos:

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

Verifique se você está no modo de edição antes de fazer qualquer coisa na camada:

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

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

AFAIK, QGIS usa índices de campo, não nomes de campo, para atribuição. Tente usar feature[layer.fieldNameIndex(attrName)] = 1.

Jan Šimbera
fonte
Eu tento: feature.setAttribute(attrName, 1)e feature.setAttribute(layer.fieldNameIndex(attrName), 1)com os mesmos resultados (de referência da API tem dois métodos setAttribute para recurso com índice e nome)
dmitry.v.kiselev
feature[layer.fieldNameIndex(attrName)] = 1também o mesmo.
precisa saber é o seguinte
Você inicializou os atributos ( feature.initAttributes(len(attributes)))?
Jan Šimbera
Adicione feature.initAttributes(1)com o mesmo resultado. Mas verifique feature[attrName]e tenho 1 que eu estou procurando. Mas ainda tem NULL se eu abrir a tabela de atributos na GUI.
precisa saber é o seguinte