Important
Translation is a community effort you can join. This page is currently translated at no translated elements!.
21. Cheat sheet for PyQGIS
Hint
The code snippets on this page need the following imports if you're outside the pyqgis console:
1from qgis.PyQt.QtCore import (
2 QRectF,
3)
4
5from qgis.core import (
6 Qgis,
7 QgsProject,
8 QgsLayerTreeModel,
9)
10
11from qgis.gui import (
12 QgsLayerTreeView,
13)
21.1. User Interface
Change Look & Feel
1from qgis.PyQt.QtWidgets import QApplication
2
3app = QApplication.instance()
4app.setStyleSheet(".QWidget {color: blue; background-color: yellow;}")
5# You can even read the stylesheet from a file
6with open("testdata/file.qss") as qss_file_content:
7 app.setStyleSheet(qss_file_content.read())
Change icon and title
1from qgis.PyQt.QtGui import QIcon
2
3icon = QIcon("/path/to/logo/file.png")
4iface.mainWindow().setWindowIcon(icon)
5iface.mainWindow().setWindowTitle("My QGIS")
21.2. Settings
Get QgsSettings list
1from qgis.core import QgsSettings
2
3qs = QgsSettings()
4
5for k in sorted(qs.allKeys()):
6 print (k)
21.3. Toolbars
Remove toolbar
1toolbar = iface.helpToolBar()
2parent = toolbar.parentWidget()
3parent.removeToolBar(toolbar)
4
5# and add again
6parent.addToolBar(toolbar)
Remove actions toolbar
actions = iface.attributesToolBar().actions()
iface.attributesToolBar().clear()
iface.attributesToolBar().addAction(actions[4])
iface.attributesToolBar().addAction(actions[3])
21.5. Canvas
Access canvas
canvas = iface.mapCanvas()
Change canvas color
from qgis.PyQt.QtCore import Qt
iface.mapCanvas().setCanvasColor(Qt.black)
iface.mapCanvas().refresh()
Map Update interval
from qgis.core import QgsSettings
# Set milliseconds (150 milliseconds)
QgsSettings().setValue("/qgis/map_update_interval", 150)
21.6. Layers
Add vector layer
layer = iface.addVectorLayer("testdata/data/data.gpkg|layername=airports", "Airports layer", "ogr")
if not layer or not layer.isValid():
print("Layer failed to load!")
Get active layer
layer = iface.activeLayer()
List all layers
from qgis.core import QgsProject
QgsProject.instance().mapLayers().values()
Obtain layers name
1from qgis.core import QgsVectorLayer
2layer = QgsVectorLayer("Point?crs=EPSG:4326", "layer name you like", "memory")
3QgsProject.instance().addMapLayer(layer)
4
5layers_names = []
6for layer in QgsProject.instance().mapLayers().values():
7 layers_names.append(layer.name())
8
9print("layers TOC = {}".format(layers_names))
layers TOC = ['layer name you like']
Otherwise
layers_names = [layer.name() for layer in QgsProject.instance().mapLayers().values()]
print("layers TOC = {}".format(layers_names))
layers TOC = ['layer name you like']
Find layer by name
from qgis.core import QgsProject
layer = QgsProject.instance().mapLayersByName("layer name you like")[0]
print(layer.name())
layer name you like
Set active layer
from qgis.core import QgsProject
layer = QgsProject.instance().mapLayersByName("layer name you like")[0]
iface.setActiveLayer(layer)
Refresh layer at interval
1from qgis.core import QgsProject
2
3layer = QgsProject.instance().mapLayersByName("layer name you like")[0]
4# Set seconds (5 seconds)
5layer.setAutoRefreshInterval(5000)
6# Enable data reloading
7layer.setAutoRefreshMode(Qgis.AutoRefreshMode.ReloadData)
Show methods
dir(layer)
Adding new feature with feature form
1from qgis.core import QgsFeature, QgsGeometry
2
3feat = QgsFeature()
4geom = QgsGeometry()
5feat.setGeometry(geom)
6feat.setFields(layer.fields())
7
8iface.openFeatureForm(layer, feat, False)
Adding new feature without feature form
1from qgis.core import QgsGeometry, QgsPointXY, QgsFeature
2
3pr = layer.dataProvider()
4feat = QgsFeature()
5feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(10,10)))
6pr.addFeatures([feat])
Get features
for f in layer.getFeatures():
print (f)
<qgis._core.QgsFeature object at 0x7f45cc64b678>
Get selected features
for f in layer.selectedFeatures():
print (f)
Get selected features Ids
selected_ids = layer.selectedFeatureIds()
print(selected_ids)
Create a memory layer from selected features Ids
from qgis.core import QgsFeatureRequest
memory_layer = layer.materialize(QgsFeatureRequest().setFilterFids(layer.selectedFeatureIds()))
QgsProject.instance().addMapLayer(memory_layer)
Get geometry
# Point layer
for f in layer.getFeatures():
geom = f.geometry()
print ('%f, %f' % (geom.asPoint().y(), geom.asPoint().x()))
10.000000, 10.000000
Move geometry
1from qgis.core import QgsFeature, QgsGeometry
2poly = QgsFeature()
3geom = QgsGeometry.fromWkt("POINT(7 45)")
4geom.translate(1, 1)
5poly.setGeometry(geom)
6print(poly.geometry())
<QgsGeometry: Point (8 46)>
Set the CRS
from qgis.core import QgsProject, QgsCoordinateReferenceSystem
for layer in QgsProject.instance().mapLayers().values():
layer.setCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
See the CRS
1from qgis.core import QgsProject
2
3for layer in QgsProject.instance().mapLayers().values():
4 crs = layer.crs().authid()
5 layer.setName('{} ({})'.format(layer.name(), crs))
Hide a field column
1from qgis.core import QgsEditorWidgetSetup
2
3def fieldVisibility (layer,fname):
4 setup = QgsEditorWidgetSetup('Hidden', {})
5 for i, column in enumerate(layer.fields()):
6 if column.name()==fname:
7 layer.setEditorWidgetSetup(idx, setup)
8 break
9 else:
10 continue
Layer from WKT
1from qgis.core import QgsVectorLayer, QgsFeature, QgsGeometry, QgsProject
2
3layer = QgsVectorLayer('Polygon?crs=epsg:4326', 'Mississippi', 'memory')
4pr = layer.dataProvider()
5poly = QgsFeature()
6geom = QgsGeometry.fromWkt("POLYGON ((-88.82 34.99,-88.09 34.89,-88.39 30.34,-89.57 30.18,-89.73 31,-91.63 30.99,-90.87 32.37,-91.23 33.44,-90.93 34.23,-90.30 34.99,-88.82 34.99))")
7poly.setGeometry(geom)
8pr.addFeatures([poly])
9layer.updateExtents()
10QgsProject.instance().addMapLayers([layer])
Load all vector layers from GeoPackage
1from qgis.core import QgsDataProvider
2
3fileName = "testdata/sublayers.gpkg"
4layer = QgsVectorLayer(fileName, "test", "ogr")
5subLayers = layer.dataProvider().subLayers()
6
7for subLayer in subLayers:
8 name = subLayer.split(QgsDataProvider.SUBLAYER_SEPARATOR)[1]
9 uri = "%s|layername=%s" % (fileName, name,)
10 # Create layer
11 sub_vlayer = QgsVectorLayer(uri, name, 'ogr')
12 # Add layer to map
13 QgsProject.instance().addMapLayer(sub_vlayer)
Load tile layer (XYZ-Layer)
1from qgis.core import QgsRasterLayer, QgsProject
2
3def loadXYZ(url, name):
4 rasterLyr = QgsRasterLayer("type=xyz&url=" + url, name, "wms")
5 QgsProject.instance().addMapLayer(rasterLyr)
6
7urlWithParams = 'https://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&zmax=19&zmin=0&crs=EPSG3857'
8loadXYZ(urlWithParams, 'OpenStreetMap')
Remove all layers
QgsProject.instance().removeAllMapLayers()
Remove all
QgsProject.instance().clear()
21.7. Table of contents
Access checked layers
iface.mapCanvas().layers()
Remove contextual menu
1ltv = iface.layerTreeView()
2mp = ltv.menuProvider()
3ltv.setMenuProvider(None)
4# Restore
5ltv.setMenuProvider(mp)
21.8. Advanced TOC
Root node
1from qgis.core import QgsVectorLayer, QgsProject, QgsLayerTreeLayer
2
3root = QgsProject.instance().layerTreeRoot()
4node_group = root.addGroup("My Group")
5
6layer = QgsVectorLayer("Point?crs=EPSG:4326", "layer name you like", "memory")
7QgsProject.instance().addMapLayer(layer, False)
8
9node_group.addLayer(layer)
10
11print(root)
12print(root.children())
Access the first child node
1from qgis.core import QgsLayerTreeGroup, QgsLayerTreeLayer, QgsLayerTree
2
3child0 = root.children()[0]
4print (child0.name())
5print (type(child0))
6print (isinstance(child0, QgsLayerTreeLayer))
7print (isinstance(child0.parent(), QgsLayerTree))
My Group
<class 'qgis._core.QgsLayerTreeGroup'>
False
True
Find groups and nodes
1from qgis.core import QgsLayerTreeGroup, QgsLayerTreeLayer
2
3def get_group_layers(group):
4 print('- group: ' + group.name())
5 for child in group.children():
6 if isinstance(child, QgsLayerTreeGroup):
7 # Recursive call to get nested groups
8 get_group_layers(child)
9 else:
10 print(' - layer: ' + child.name())
11
12
13root = QgsProject.instance().layerTreeRoot()
14for child in root.children():
15 if isinstance(child, QgsLayerTreeGroup):
16 get_group_layers(child)
17 elif isinstance(child, QgsLayerTreeLayer):
18 print ('- layer: ' + child.name())
- group: My Group
- layer: layer name you like
Find group by name
print (root.findGroup("My Group"))
<QgsLayerTreeGroup: My Group>
Find layer by id
print(root.findLayer(layer.id()))
<QgsLayerTreeLayer: layer name you like>
Add layer
1from qgis.core import QgsVectorLayer, QgsProject
2
3layer1 = QgsVectorLayer("Point?crs=EPSG:4326", "layer name you like 2", "memory")
4QgsProject.instance().addMapLayer(layer1, False)
5node_layer1 = root.addLayer(layer1)
6# Remove it
7QgsProject.instance().removeMapLayer(layer1)
Add group
1from qgis.core import QgsLayerTreeGroup
2
3node_group2 = QgsLayerTreeGroup("Group 2")
4root.addChildNode(node_group2)
5QgsProject.instance().mapLayersByName("layer name you like")[0]
Move loaded layer
1layer = QgsProject.instance().mapLayersByName("layer name you like")[0]
2root = QgsProject.instance().layerTreeRoot()
3
4myLayer = root.findLayer(layer.id())
5myClone = myLayer.clone()
6parent = myLayer.parent()
7
8myGroup = root.findGroup("My Group")
9# Insert in first position
10myGroup.insertChildNode(0, myClone)
11
12parent.removeChildNode(myLayer)
Move loaded layer to a specific group
1QgsProject.instance().addMapLayer(layer, False)
2
3root = QgsProject.instance().layerTreeRoot()
4myGroup = root.findGroup("My Group")
5myOriginalLayer = root.findLayer(layer.id())
6myLayer = myOriginalLayer.clone()
7myGroup.insertChildNode(0, myLayer)
8parent.removeChildNode(myOriginalLayer)
Toggling active layer visibility
root = QgsProject.instance().layerTreeRoot()
node = root.findLayer(layer.id())
new_state = Qt.Checked if node.isVisible() == Qt.Unchecked else Qt.Unchecked
node.setItemVisibilityChecked(new_state)
Is group selected
1def isMyGroupSelected( groupName ):
2 myGroup = QgsProject.instance().layerTreeRoot().findGroup( groupName )
3 return myGroup in iface.layerTreeView().selectedNodes()
4
5print(isMyGroupSelected( 'my group name' ))
False
Expand node
print(myGroup.isExpanded())
myGroup.setExpanded(False)
Hidden node trick
1from qgis.core import QgsProject
2
3model = iface.layerTreeView().layerTreeModel()
4ltv = iface.layerTreeView()
5root = QgsProject.instance().layerTreeRoot()
6
7layer = QgsProject.instance().mapLayersByName('layer name you like')[0]
8node = root.findLayer(layer.id())
9
10index = model.node2index( node )
11ltv.setRowHidden( index.row(), index.parent(), True )
12node.setCustomProperty( 'nodeHidden', 'true')
13ltv.setCurrentIndex(model.node2index(root))
Node signals
1def onWillAddChildren(node, indexFrom, indexTo):
2 print ("WILL ADD", node, indexFrom, indexTo)
3
4def onAddedChildren(node, indexFrom, indexTo):
5 print ("ADDED", node, indexFrom, indexTo)
6
7root.willAddChildren.connect(onWillAddChildren)
8root.addedChildren.connect(onAddedChildren)
Remove layer
root.removeLayer(layer)
Remove group
root.removeChildNode(node_group2)
Create new table of contents (TOC)
1root = QgsProject.instance().layerTreeRoot()
2model = QgsLayerTreeModel(root)
3view = QgsLayerTreeView()
4view.setModel(model)
5view.show()
Move node
cloned_group1 = node_group.clone()
root.insertChildNode(0, cloned_group1)
root.removeChildNode(node_group)
Rename node
cloned_group1.setName("Group X")
node_layer1.setName("Layer X")
21.9. Processing algorithms
Get algorithms list
1from qgis.core import QgsApplication
2
3for alg in QgsApplication.processingRegistry().algorithms():
4 if 'buffer' == alg.name():
5 print("{}:{} --> {}".format(alg.provider().name(), alg.name(), alg.displayName()))
QGIS (native c++):buffer --> Buffer
Get algorithms help
Random selection
from qgis import processing
processing.algorithmHelp("native:buffer")
...
Run the algorithm
For this example, the result is stored in a temporary memory layer which is added to the project.
from qgis import processing
result = processing.run("native:buffer", {'INPUT': layer, 'OUTPUT': 'memory:'})
QgsProject.instance().addMapLayer(result['OUTPUT'])
Processing(0): Results: {'OUTPUT': 'output_d27a2008_970c_4687_b025_f057abbd7319'}
How many algorithms are there?
len(QgsApplication.processingRegistry().algorithms())
How many providers are there?
from qgis.core import QgsApplication
len(QgsApplication.processingRegistry().providers())
How many expressions are there?
from qgis.core import QgsExpression
len(QgsExpression.Functions())
21.10. Decorators
CopyRight
1from qgis.PyQt.Qt import QTextDocument
2from qgis.PyQt.QtGui import QFont
3
4mQFont = "Sans Serif"
5mQFontsize = 9
6mLabelQString = "© QGIS 2019"
7mMarginHorizontal = 0
8mMarginVertical = 0
9mLabelQColor = "#FF0000"
10
11INCHES_TO_MM = 0.0393700787402 # 1 millimeter = 0.0393700787402 inches
12case = 2
13
14def add_copyright(p, text, xOffset, yOffset):
15 p.translate( xOffset , yOffset )
16 text.drawContents(p)
17 p.setWorldTransform( p.worldTransform() )
18
19def _on_render_complete(p):
20 deviceHeight = p.device().height() # Get paint device height on which this painter is currently painting
21 deviceWidth = p.device().width() # Get paint device width on which this painter is currently painting
22 # Create new container for structured rich text
23 text = QTextDocument()
24 font = QFont()
25 font.setFamily(mQFont)
26 font.setPointSize(int(mQFontsize))
27 text.setDefaultFont(font)
28 style = "<style type=\"text/css\"> p {color: " + mLabelQColor + "}</style>"
29 text.setHtml( style + "<p>" + mLabelQString + "</p>" )
30 # Text Size
31 size = text.size()
32
33 # RenderMillimeters
34 pixelsInchX = p.device().logicalDpiX()
35 pixelsInchY = p.device().logicalDpiY()
36 xOffset = pixelsInchX * INCHES_TO_MM * int(mMarginHorizontal)
37 yOffset = pixelsInchY * INCHES_TO_MM * int(mMarginVertical)
38
39 # Calculate positions
40 if case == 0:
41 # Top Left
42 add_copyright(p, text, xOffset, yOffset)
43
44 elif case == 1:
45 # Bottom Left
46 yOffset = deviceHeight - yOffset - size.height()
47 add_copyright(p, text, xOffset, yOffset)
48
49 elif case == 2:
50 # Top Right
51 xOffset = deviceWidth - xOffset - size.width()
52 add_copyright(p, text, xOffset, yOffset)
53
54 elif case == 3:
55 # Bottom Right
56 yOffset = deviceHeight - yOffset - size.height()
57 xOffset = deviceWidth - xOffset - size.width()
58 add_copyright(p, text, xOffset, yOffset)
59
60 elif case == 4:
61 # Top Center
62 xOffset = deviceWidth / 2
63 add_copyright(p, text, xOffset, yOffset)
64
65 else:
66 # Bottom Center
67 yOffset = deviceHeight - yOffset - size.height()
68 xOffset = deviceWidth / 2
69 add_copyright(p, text, xOffset, yOffset)
70
71# Emitted when the canvas has rendered
72iface.mapCanvas().renderComplete.connect(_on_render_complete)
73# Repaint the canvas map
74iface.mapCanvas().refresh()
21.11. Composer
Get print layout by name
1composerTitle = 'MyComposer' # Name of the composer
2
3project = QgsProject.instance()
4projectLayoutManager = project.layoutManager()
5layout = projectLayoutManager.layoutByName(composerTitle)