18. Plug-in-lagen gebruiken

Hint

De codesnippers op deze pagina hebben de volgende import nodig als u buiten de console van PyQGIS bent:

1from qgis.core import (
2    QgsPluginLayer,
3    QgsPluginLayerType,
4    QgsMapLayerRenderer,
5    QgsApplication,
6    QgsProject,
7)
8
9from qgis.PyQt.QtGui import QImage

Als uw plug-in zijn eigen methoden gebruikt om een kaartlaag te renderen, zou het schrijven van uw eigen type laag, gebaseerd op QgsPluginLayer, de beste manier kunnen zijn om dat te implementeren.

18.1. Sub-klassen in QgsPluginLayer

Hieronder staat een voorbeeld van een minimale implementatie van QgsPluginLayer. Het is gebaseerd op de originele code van de voorbeeld plug-in Watermark.

De aangepaste renderer is het deel van de implementatie dat feitelijk tekent op het kaartvenster.

 1class WatermarkLayerRenderer(QgsMapLayerRenderer):
 2
 3    def __init__(self, layerId, rendererContext):
 4        super().__init__(layerId, rendererContext)
 5
 6    def render(self):
 7        image = QImage("/usr/share/icons/hicolor/128x128/apps/qgis.png")
 8        painter = self.renderContext().painter()
 9        painter.save()
10        painter.drawImage(10, 10, image)
11        painter.restore()
12        return True
13
14class WatermarkPluginLayer(QgsPluginLayer):
15
16    LAYER_TYPE="watermark"
17
18    def __init__(self):
19        super().__init__(WatermarkPluginLayer.LAYER_TYPE, "Watermark plugin layer")
20        self.setValid(True)
21
22    def createMapRenderer(self, rendererContext):
23        return WatermarkLayerRenderer(self.id(), rendererContext)
24
25    def setTransformContext(self, ct):
26        pass
27
28    # Methods for reading and writing specific information to the project file can
29    # also be added:
30
31    def readXml(self, node, context):
32        pass
33
34    def writeXml(self, node, doc, context):
35        pass

De laag van de plug-in kan worden toegevoegd aan het project en aan het kaartvenster, net zoals elke andere laag:

plugin_layer = WatermarkPluginLayer()
QgsProject.instance().addMapLayer(plugin_layer)

Bij het laden van een project dat een dergelijke laag bevat, is een klasse factory nodig:

 1class WatermarkPluginLayerType(QgsPluginLayerType):
 2
 3    def __init__(self):
 4        super().__init__(WatermarkPluginLayer.LAYER_TYPE)
 5
 6    def createLayer(self):
 7        return WatermarkPluginLayer()
 8
 9    # You can also add GUI code for displaying custom information
10    # in the layer properties
11    def showLayerProperties(self, layer):
12        pass
13
14
15# Keep a reference to the instance in Python so it won't
16# be garbage collected
17plt =  WatermarkPluginLayerType()
18
19assert QgsApplication.pluginLayerRegistry().addPluginLayerType(plt)