Tôi đang phát triển một addon cho QGIS cần gán UUID cho bất kỳ tính năng nào ngay khi được thêm vào lớp. Tôi đang sử dụng tín hiệu Tính năng bổ sung để ghi UUID vào trường tương ứng của tính năng.
Đây là mã mà tôi đang sử dụng (càng đơn giản càng tốt):
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()
(Tôi đã tạo một plugin mới với bổ trợ 'Trình tạo plugin' và ở trên đó là mã duy nhất tôi đã thêm vào nó .)
Trừ khi tôi thiếu một cái gì đó, điều này tuân theo các hướng dẫn từ tài liệu trong sách hướng dẫn dành cho nhà phát triển của QGIS : http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#modifying-vector-layers-with- an-chỉnh sửa-bộ đệm
Khi tôi chỉnh sửa lớp, nếu tôi thêm một tính năng, trường 'guide_pol' sẽ được đặt thành 'some_random_uuid' như mong đợi. Tuy nhiên, tôi có thể cam kết các thay đổi mà không gặp sự cố, nếu thay vì cam kết các thay đổi, tôi cố gắng hủy bỏ các sự cố QGIS với lỗi 0xC0000005 (Vi phạm truy cập) .
Thật thú vị, lệnh 'Đặt UUID' không được thêm vào ngăn xếp hoàn tác / làm lại (ít nhất, không phải vào Bảng điều khiển hoàn tác / làm lại ) và nếu tôi cũng cố gắng hoàn tác nó .
Tôi đang sử dụng QGIS 2.14 nhưng tôi đã quan sát hành vi tương tự với QGIS 2.12.
Tôi đang có một thời gian khó khăn để làm việc này. Có điều gì tôi đang làm sai?