通过Python脚本startEditing的编辑层,我们是否必须“关闭”编辑?

问题描述

我正在向量层上工作,在这里我必须将所有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.