So here is a neat trick. Lets say you wanted to access the scale of a composer map to make it part of a label. The scale bar can already be set to numeric to show the number value but what if it needs to be part of an existing label with other text. Not to fear, expression functions are here.
- Create a new composer. Add the map frame and a label.
- Set the item ID of the map frame to something you can remember, lets just use
- Select the label and add some text
- Click Insert Expression
Now for the cool part
- Select Function Editor
- Click New File. Give the file a new name and hit save. I called it composer functions.
In the code editor paste this code:
from qgis.utils import iface from qgis.core import * from qgis.gui import * @qgsfunction(args="auto", group='Composer') def composeritemattr(composername, mapname, attrname, feature, parent): composers = iface.activeComposers() # Find the composer with the given name comp = [composer.composition() for composer in composers if composer.composerWindow().windowTitle() == composername] # Find the item item = comp.getComposerItemById(mapname) # Get the attr by name and call return getattr(item, attrname)()
- Click Run Script
Now in your label use this text:
Scale: [% composeritemattr('Composer 1', 'themap', 'scale')%]
Composer 1 to match your composer name, and the
themap to match your item ID.
and like magic here is the scale from the map item in a label:
Check the expression error section if the label doesn’t render