Estou desenvolvendo um complemento para o QGIS que precisa atribuir um UUID a qualquer recurso assim que ele for adicionado à camada. Estou usando o sinal featureAdded para escrever o UUID no campo correspondente do recurso.
Este é o código que estou usando (o mais simplificado possível):
def run(self):
self.iface.mapCanvas().currentLayer().featureAdded.connect(self.onFeatureAdded)
def onFeatureAdded(self, fid):
layer = self.iface.mapCanvas().currentLayer()
layer.beginEditCommand("Set UUID")
print layer.changeAttributeValue(fid, layer.fieldNameIndex('guid_pol'), 'some_random_uuid') # prints True
layer.endEditCommand()
(Criei um novo plug-in com o complemento 'Plugin Builder' e o código acima é o único que adicionei a ele .)
A menos que esteja faltando alguma coisa, siga as diretrizes da documentação do livro de receitas do desenvolvedor do QGIS : http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#modifying-vector-layers-with- um buffer de edição
Quando edito a camada, se adicionar um recurso, o campo 'guid_pol' será definido como 'some_random_uuid' conforme o esperado. No entanto, posso confirmar as alterações sem problemas. Se, ao invés de confirmar as alterações, eu tentar cancelá-las, o QGIS trava com o erro 0xC0000005 (Violação de Acesso) .
Curiosamente, o comando 'Set UUID' não é adicionado à pilha de desfazer / refazer (pelo menos, não ao painel Desfazer / refazer ) e se eu tentar desfazer, ele também trava .
Estou usando o QGIS 2.14, mas observei um comportamento semelhante ao QGIS 2.12.
Estou tendo dificuldades para fazer isso funcionar. Existe algo que estou fazendo de errado?
fonte