Thiết lập thuộc tính tính năng theo tên thông qua api python api?


13

Tôi cố gắng đặt thuộc tính tính năng theo tên thuộc tính với mã này

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

nhưng kết quả là tôi có NULL trong tất cả các lĩnh vực. Nếu tôi sử dụng

feature.setAttributes([1])

nó hoạt động đúng

Tôi đã làm gì sai? Tại sao tính năng [attrName] = 1 không hoạt động?

Cập nhật : Tìm giải pháp này

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

Câu trả lời:


17

QGIS có thể sử dụng tên trường và chỉ mục:

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

Hãy chắc chắn rằng bạn đang ở chế độ chỉnh sửa trước khi bạn làm bất cứ điều gì trên lớp:

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

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

-1

AFAIK, QGIS sử dụng các chỉ mục trường, không phải tên trường, để gán. Hãy thử sử dụng feature[layer.fieldNameIndex(attrName)] = 1.


Tôi thử: feature.setAttribute(attrName, 1)feature.setAttribute(layer.fieldNameIndex(attrName), 1)với cùng kết quả (tham chiếu api có hai phương thức setAttribution cho tính năng với chỉ mục và tên)
dmitry.v.kiselev

feature[layer.fieldNameIndex(attrName)] = 1cũng tương tự.
dmitry.v.kiselev

Bạn đã khởi tạo các thuộc tính ( feature.initAttributes(len(attributes)))?
Jan Šimbera

Thêm feature.initAttributes(1)với kết quả tương tự. Nhưng kiểm tra feature[attrName]và có 1 cái mà tôi đang tìm kiếm. Nhưng vẫn có NULL nếu tôi mở Bảng thuộc tính trong gui.
dmitry.v.kiselev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.