Gostaria de atualizar um atributo de um recurso. No entanto, não sei atualizá-lo usando o objeto de recurso. Eu tenho que usar o provedor de dados para atualizá-lo.
layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line')
layer = layers[0]
dp = layer.dataProvider()
it = dp.getFeatures()
for i in range(0, dp.featureCount()):
feat = it.next()
attrs = { 2 : 30 }
layer.dataProvider().changeAttributeValues({ feat.id() : attrs })
Posso alterar o valor de um atributo usando o QgsFeature
objeto?
Além disso, é possível fazer um loop usando um objeto iterador?
my_index = layer.fieldNameIndex("my_field_name")
para obter o índice.Respostas:
Respondendo às suas duas perguntas:
Você pode alterar os valores dos recursos do
layer
objeto, sem necessidade de acessar odataProvider()
.Sim, você pode usar o iterador em um
for
loop.Verifique o código abaixo:
Isso atualiza o terceiro valor do campo (índice 2) para 30 para todos os recursos da camada.
Nota: Como você apontou, por algum motivo, o objeto QgsFeature não pode atualizar os valores dos recursos, embora a API diga que pode.
fonte
Sim, mas você precisa conhecer o índice do campo:
Você pode obter os campos usando
QgsFeature::fields
e, em seguida, iterá-los até encontrar o que deseja ouQgsFeature::attribute(const QString & name )
encontrar o índice do campo pelo nome.O motivo do QVariant é que o setAttribute pode usar os tipos Inteiro, Flutuante, Data e Texto. QgsFeature.attribute (name) retorna uma variante também do tipo int se o atributo for encontrado e outra coisa se não puder ser encontrado. Esteja ciente disso no seu código. Um bloco try..except seria garantido, tente converter para int e, exceto se type não for int.
É possível que seu recurso não suporte esse método. Outro método que empreguei é
QgsVectorLayer::changeAttributeValue
:Isso informa à camada para atualizar um recurso específico e um atributo específico. No caso de exemplo, o valor vem de um widget.
fonte
feat.setAttribute(1, QVariant(20))
, mas o sistema disse TypeError: PyQt4.QtCore.QVariant representa um tipo mapeados e não pode ser instanciadofeat.setAttribute(1, 20)
mas os valores não mudam. No entanto, eu possoprint(feat.attributes()[1])