[QGIS-Developer] Access layer from QgsExpressionContext with Python

Benjamin Jakimow benjamin.jakimow at geo.hu-berlin.de
Sat Mar 26 22:37:42 PDT 2022


Dear Developers,


to implement a QgsExpressionFunction I like to access the "layer" from a 
QgsExpressionContext "context".
Using the C++ API this can be done with the QgsExpressionUtils:

QgsVectorLayer *vl = QgsExpressionUtils::getVectorLayer( 
context->variable( QStringLiteral( "layer" ) ), parent );

(several example exist qgsexpressionfunction.cpp)


In Python the QgsExpressionUtils are not available and accessing the 
"layer" attribute raises a
TypeError "unable to convert a C++ 'QPointer<QgsMapLayer>' instance to a 
Python object"

Example:
from qgis.core import QgsExpressionContext, QgsVectorLayer, 
QgsExpressionContextUtils

lyr = QgsVectorLayer('point?crs=epsg:4326&field=id:integer', 'dummy', 
'memory')

context = QgsExpressionContext()
context.appendScope(QgsExpressionContextUtils.layerScope(lyr))
print(f'name={context.variable("layer_name")}')

# this raises: TypeError: unable to convert a C++ 
'QPointer<QgsMapLayer>' instance to a Python object
lyr2 = context.variable('layer')


Is there another way to get the QgsMapLayer instance in Python?

If not, I could open an issue to bring the QgsExpressionUtils into the 
QGIS Python API as well.








-- 
--
Benjamin Jakimow, Doctoral Researcher
Earth Observation Lab | Geography Department | Humboldt-Universität zu 
Berlin

e-mail: benjamin.jakimow at geo.hu-berlin.de

phone:  +49 (0) 30 2093 6894
mobile: +49 (0) 157 5656 8477
fax:    +49 (0) 30 2093 6848
mail:   Unter den Linden 6 | 10099 Berlin | Germany
room: 2'222


More information about the QGIS-Developer mailing list