[Qgis-developer] iterating over fields an values API 2.0

Martin Dobias wonder.sk at gmail.com
Mon Feb 17 09:43:27 PST 2014

On Mon, Feb 17, 2014 at 10:36 PM, PIERRE Sylvain <sylvain.pierre at cg67.fr> wrote:
> When iterating over vector features like this:
> fields = layer.pendingFields()
>   field_names = [field.name() for field in fields]
>   for elem in layer.getFeatures():
>           atr = dict(zip(field_names, elem.attributes()))
> returns this:
> {PyQt4.QtCore.QString(u'off_set'): <PyQt4.QtCore.QVariant object at
> 0x05115C70>, PyQt4.QtCore.QString(u'code'): <PyQt4.QtCore.QVariant object at
> 0x05115BC8>, PyQt4.QtCore.QString(u'pk'): <PyQt4.QtCore.QVariant object at
> 0x05115C00>, PyQt4.QtCore.QString(u'id'): <PyQt4.QtCore.QVariant object at
> 0x05115B90>, PyQt4.QtCore.QString(u'annee'): <PyQt4.QtCore.QVariant object
> at 0x05115CA8>, PyQt4.QtCore.QString(u'id_anom'): <PyQt4.QtCore.QVariant
> object at 0x05115B58>, PyQt4.QtCore.QString(u'fk_position'):
> <PyQt4.QtCore.QVariant object at 0x05115C38>,
> PyQt4.QtCore.QString(u'resolu'): <PyQt4.QtCore.QVariant object at
> 0x05115CE0>}
> Instead of tupple like u'off_set': 1 ...

You have not set SIP api to version 2 to QString, QVariant and other
Qt classes. QGIS python package tries to do that automatically for
you, but if you imported PyQt4 python modules before QGIS python
modules, that will not work. You have two options:
1. move import of QGIS module before PyQt4
2. keep the order of imports as is, but put these lines before import of PyQt4:
import sip
sip.setapi("QString", 2)
sip.setapi("QVariant", 2)

This is only necessary in standalone applications - inside QGIS
application this initialization is done before any plugins are loaded,
so this issue does not come up. Probably in qgis __init__.py there
should be some code checking if there are not Qt classes imported with
API v1 - in such case we could throw an exception.


More information about the Qgis-developer mailing list