レイヤーに追加されたらすぐにUUIDをフィーチャに割り当てる必要があるQGISのアドオンを開発しています。featureAdded信号を使用して、機能の対応するフィールドにUUIDを書き込みます。
これは私が使用しているコードです(可能な限り簡略化しています):
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()
(私は 'Plugin Builder'アドオンで新しいプラグインを作成しました、そしてそれは私がそれに追加した唯一のコードです。)
私は何かが欠けていない限り、これは中のドキュメントからのガイドライン次のQGISの開発者の料理を:http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#modifying-vector-layers-with-編集バッファー
レイヤーを編集するときに、フィーチャを追加すると、フィールド「guid_pol」が期待どおり「some_random_uuid」に設定されます。問題なく変更をコミットできますが、変更をコミットする代わりにキャンセルしようとすると、エラー0xC0000005(アクセス違反)でQGISがクラッシュします。
興味深いことに、「Set UUID」コマンドは元に戻す/やり直しスタックに追加されません(少なくとも、元に戻す/やり直しパネルには追加されません)。また、元に戻そうとするとクラッシュします。
QGIS 2.14を使用していますが、QGIS 2.12でも同様の動作が見られました。
これを機能させるのに苦労しています。私が間違っていることはありますか?