Ustawienie atrybutu funkcji według nazwy za pomocą interfejsu API Python QGIS?

13

Próbuję ustawić atrybuty funkcji według nazwy atrybutu za pomocą tego kodu

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

ale w rezultacie mam NULL we wszystkich polach. Jeśli użyję

feature.setAttributes([1])

działa poprawnie.

Co robię źle? Dlaczego funkcja [attrName] = 1 nie działa?

Aktualizacja : znajdź to rozwiązanie

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
źródło

Odpowiedzi:

18

QGIS może używać nazw pól i indeksów:

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

Upewnij się, że jesteś w trybie edycji, zanim zrobisz cokolwiek na warstwie:

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

#Call commit to save the changes
layer.commitChanges()
Nathan W.
źródło
-1

AFAIK, QGIS używa do przypisania indeksów pól, a nie nazw pól. Spróbuj użyć feature[layer.fieldNameIndex(attrName)] = 1.

Jan Šimbera
źródło
Staram: feature.setAttribute(attrName, 1)i feature.setAttribute(layer.fieldNameIndex(attrName), 1)ze same wyniki (odniesienie api mają dwie metody setAttribute dla funkcji z indeksem i nazwa)
dmitry.v.kiselev
feature[layer.fieldNameIndex(attrName)] = 1również to samo.
dmitry.v.kiselev
Czy zainicjowałeś atrybuty ( feature.initAttributes(len(attributes)))?
Jan Šimbera
Dodaj feature.initAttributes(1)z tym samym wynikiem. Ale sprawdź feature[attrName]i dostałem 1, którego szukam. Ale nadal mam NULL, jeśli otworzę tabelę atrybutów w GUI.
dmitry.v.kiselev