Skip to content

Instantly share code, notes, and snippets.

@NathanW2
Last active December 17, 2015 21:29
Show Gist options
  • Save NathanW2/5675192 to your computer and use it in GitHub Desktop.
Save NathanW2/5675192 to your computer and use it in GitHub Desktop.
Notify changed for QgsFeature
from PyQt4.QtCore import QObject, pyqtSignal
class FeatureWrapper(QObject):
notifychanged = pyqtSignal(str, object)
def __init__(self, feature):
super(FeatureWrapper,self).__init__()
self.feature = feature
def __setitem__(self, key, value):
self.feature.__setitem__(key, value)
self.notifychanged.emit(key, value)
def __getattr__(self,attr):
return self.feature.__getattribute__(attr)
def __getitem__(self, key):
return self.feature.__getitem__(key)
def __repr__(self):
return self.feature.__repr__() + "(Wrapped)"
def wrap(feature):
return FeatureWrapper(feature)
from types import MethodType
QgsFeature.wrap = MethodType(wrap, None, QgsFeature)

Attention!

This is just one of my random snippets. There could be better ways.

Store featurenotify.py in ~\.qgis2\python\

Usage from Python console:

>>> import featurenotify
>>> layer = iface.activeLayer()
>>> feature = layer.selectedFeatures()[0]
>>> feature
<qgis.core.QgsFeature object at 0x0CD9BAE0>
>>> feature = feature.wrap()
>>> feature
<qgis.core.QgsFeature object at 0x0CD9BAE0>(Wrapped)

Wrapped features will emit changed signal:

>>> def changed(name, value):
...     print "{} changed to {}".format(name, value)
>>> feature.notifychanged.connect(changed)
>>> feature["ZValue"] = 100.00
ZValue changed to 100.00

Note: Only works if you accesss fields using []. Setting fields using setAttribute() will not trigger the event.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment