Mengatur atribut fitur berdasarkan nama melalui QGIS python api?

13

Saya mencoba mengatur atribut fitur berdasarkan nama atribut dengan kode ini

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

tapi hasilnya saya punya NULL di semua bidang. Jika saya gunakan

feature.setAttributes([1])

ini bekerja dengan baik.

Apa yang saya lakukan salah? Mengapa fitur [attrName] = 1 tidak berfungsi?

Pembaruan : Temukan solusi ini

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
sumber

Jawaban:

17

QGIS dapat menggunakan nama dan indeks bidang:

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

Pastikan Anda berada dalam mode edit sebelum Anda melakukan sesuatu pada layer:

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

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

AFAIK, QGIS menggunakan indeks bidang, bukan nama bidang, untuk penugasan. Coba gunakan feature[layer.fieldNameIndex(attrName)] = 1.

Jan Šimbera
sumber
Saya mencoba: feature.setAttribute(attrName, 1)dan feature.setAttribute(layer.fieldNameIndex(attrName), 1)dengan hasil yang sama (referensi api memiliki dua metode setAttribute untuk fitur dengan indeks dan nama)
dmitry.v.kiselev
feature[layer.fieldNameIndex(attrName)] = 1juga sama.
dmitry.v.kiselev
Sudahkah Anda menginisialisasi atribut ( feature.initAttributes(len(attributes)))?
Jan Šimbera
Tambahkan feature.initAttributes(1)dengan hasil yang sama. Tapi periksa feature[attrName]dan dapatkan 1 yang saya cari. Tetapi masih memiliki NULL jika saya membuka Tabel Atribut di gui.
dmitry.v.kiselev