如何访问已删除的功能属性(提交之前)


13

我为图层上的功能删除事件设置了信号:

self.layer.featureDeleted.connect(self.feature_deleted)

当我尝试从插槽上已删除的功能中获取属性时,会引发StopIteration错误(即,它无法检索该功能)。

我以为在提交对图层的更改之前,我仍然应该能够从已删除的要素中检索属性?否则,我看不到fid参数的用途。

def feature_deleted(self, fid):
    feature = self.layer.getFeatures(QgsFeatureRequest().setFilterFid(int(fid))).next()
    idx = self.layer.fieldNameIndex('my_attribute')
    print feature.attributes()[idx]

我如何访问已删除要素的属性(在提交对图层的更改之前)?


1
似乎已删除的要素不会存储在任何地方……除了在图层的原始版本中……所以……也许打开它两次,然后使用您要修改的图层的编辑缓冲区返回的DeletedFeatureIds?我只发现存储了属性值更改或几何更改...没有删除的要素(只有它们的featureIds ...)
snaileater

@snaileater复制图层对于我而言是一项昂贵的操作。我将尝试记录所选要素的属性,并将其与更改提交后剩下的属性进行比较。
马特

@Matt也许此邮件列表上的帖子会有所帮助:lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas '16

Answers:


5

在两刻之后,您仍然可以获得要删除的功能:

  1. 当您在编辑会话中将其删除但尚未提交或保存更改时(即,您仍然可以回滚)。

    layer = iface.activeLayer()
    idx = layer.fieldNameIndex( 'my_attribute' )
    def feature_deleted( fid ):
        feature = layer.dataProvider().getFeatures( QgsFeatureRequest( fid ) ).next()
        print feature.id(), feature.attributes()[idx]
    
    layer.featureDeleted.connect( feature_deleted )
    
  2. 在提交已删除的功能之前(即,您刚刚单击了Save Layer Edits按钮或刚刚调用了layer.commitChanges())。

    layer = iface.activeLayer()
    idx = layer.fieldNameIndex( 'my_attribute' )
    def features_deleted():
        if layer.editBuffer():
           ids = layer.editBuffer().deletedFeatureIds()
           for feature in layer.dataProvider().getFeatures( QgsFeatureRequest().setFilterFids( ids ) ):
               print feature.id(), feature.attributes()[idx]
    
    layer.beforeCommitChanges.connect( features_deleted )
    

这是一个很好的解决方案,但似乎不适用于postGis图层。在我看来,他们处理编辑缓冲区的方式根本不同。即使图层仍处于编辑模式,我也会遇到停止迭代错误。有什么建议吗?
杰西·麦克米伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.