问题描述
我正在向量层上工作,在这里我必须将所有n + i [id]个属性合并到entity(n)[id]中,其中entity(n + i)[id]等于entity(n)[id ],然后删除所有n + i个实体。
一切正常,但是在提交更改之前我多次调用了startEditing
函数,我的问题是:调用commitChanges
是否关闭了startEditing
,还是让它打开了,就像它是一个文件一样描述符或工作完成后需要释放的指针?
代码是:
olayer.startEditing()
olayer.changeAttributeValue(n,id_obj,id_obj_sum,NULL,True)
olayer.commitChanges()
olayer.startEditing()
i= i-1
while i >=1:
olayer.deleteFeature(n+i)
i=i-1
olayer.commitChanges()
如您所见,我们多次调用olayer.startEditing
,因为所有代码都在主体中,所以调用次数更多。
那么,这会导致成群的startEditing“ pointers”还是只是不断将olayer可编辑状态设置为“ open to edition”?
实际上,代码可以工作,但是速度很慢,这是为什么吗?
解决方法
总的来说,您不应在图层中多次启动编辑模式。
您可以在对图层的所有更改结束时提交,以便您的修改同时保留在编辑缓冲区中。
如果您将QgsVectorLayer.commitChanges()
作为参数传递,False
可以让编辑模式打开(该参数称为 stopEditing
,请参阅 the docs)。像这样:
# If the commit is sucessful,let the edit mode open
layer.commitChanges(False)
另外,看看 QGIS docs 中的 with edit(layer):
语法。使用这样的语法,您可以避免启动/提交/关闭编辑模式,QGIS 会为您完成。
with edit(layer):
# All my layer modifications here
# When this line is reached,my layer modifications are already committed.