Cách truy cập thuộc tính tính năng đã xóa (trước khi cam kết)


13

Tôi có một thiết lập tín hiệu cho một sự kiện xóa tính năng trên một lớp:

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

Khi tôi thử và lấy một thuộc tính từ tính năng đã xóa trên vị trí, lỗi StopIteration sẽ bị ném (tức là nó không thể truy xuất tính năng này).

Tôi có thể nghĩ rằng tôi vẫn có thể truy xuất các thuộc tính từ một tính năng đã bị xóa trước khi các thay đổi đối với lớp được cam kết không? Mặt khác, tôi không thấy những gì sử dụng tham số fid là.

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

Làm cách nào tôi có thể truy cập các thuộc tính của tính năng bị xóa (trước khi các thay đổi đối với lớp được cam kết)?


1
Có vẻ như các tính năng đã xóa không được lưu trữ ở bất cứ đâu ... ngoại trừ trong phiên bản gốc của lớp của bạn ... vì vậy ... có thể mở nó hai lần và sau đó sử dụng các hàmFeatureIds bị trả về bởi bộ đệm chỉnh sửa của lớp bạn đang sửa đổi? Tôi chỉ thấy rằng các thay đổi giá trị thuộc tính hoặc thay đổi hình học được lưu trữ ... không bị xóa các tính năng (chỉ tính năng của chúng là ...)
snaileater

@snaileater Sao chép lớp sẽ là một hoạt động đắt tiền trong trường hợp của tôi. Tôi sẽ thử và ghi lại các thuộc tính của các tính năng khi chúng được chọn và so sánh chúng với các thuộc tính còn lại sau khi các thay đổi được cam kết.
Matt

@Matt Có lẽ việc đăng bài này trong danh sách gửi thư sẽ giúp ích: list.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Câu trả lời:


5

Sẽ có hai thời điểm mà bạn vẫn có thể nhận được các tính năng sẽ bị xóa:

  1. Khi bạn xóa chúng trong một phiên chỉnh sửa nhưng chưa cam kết hoặc lưu các thay đổi (nghĩa là bạn vẫn có thể quay lại).

    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. Ngay trước khi các tính năng bị xóa được cam kết (nghĩa là bạn vừa nhấp vào Save Layer Editsnút hoặc bạn vừa gọi 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 )

Đây là một giải pháp tốt nhưng dường như không hoạt động đối với các lớp postGis. Dường như với tôi họ xử lý bộ đệm chỉnh sửa về cơ bản khác nhau. Tôi gặp lỗi dừng lặp mặc dù lớp vẫn ở chế độ chỉnh sửa. Có gợi ý nào không?
Jesse McMillan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.