Налаштування атрибута функції по імені через QGIS python api?


13

Я намагаюся встановити атрибути функції за назвою атрибуту цим кодом

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

але в результаті я маю NULL у всіх полях. Якщо я користуюся

feature.setAttributes([1])

вона працює належним чином.

Що я роблю неправильно? Чому функція [attrName] = 1 не працює?

Оновлення : знайдіть це рішення

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

Відповіді:


18

QGIS може використовувати назви полів та індекси:

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

Переконайтесь, що ви перебуваєте в режимі редагування, перш ніж робити що-небудь на шарі:

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

#Call commit to save the changes
layer.commitChanges()

-1

AFAIK, QGIS використовує для присвоєння індекси полів, а не назви полів. Спробуйте використовувати feature[layer.fieldNameIndex(attrName)] = 1.


Я намагаюся: feature.setAttribute(attrName, 1)і feature.setAttribute(layer.fieldNameIndex(attrName), 1)з однаковими результатами (api-посилання мають два способи setAttribute для функції з індексом та назвою)
dmitry.v.kiselev

feature[layer.fieldNameIndex(attrName)] = 1теж те саме.
dmitry.v.kiselev

Ви ініціалізували атрибути ( feature.initAttributes(len(attributes)))?
Ян Шімбера

Додайте feature.initAttributes(1)з таким же результатом. Але перевірив feature[attrName]і отримав 1, який я шукав. Але все-таки мати NULL, якщо я відкрию таблицю атрибутів у gui.
dmitry.v.kiselev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.