Viktigt

Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.

18. Använda Plugin-lager

Råd

Kodsnuttarna på den här sidan behöver följande import om du befinner dig utanför pyqgis-konsolen:

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

Om ditt plugin använder sina egna metoder för att rendera ett kartlager kan det bästa sättet att implementera det vara att skriva en egen lagertyp baserad på QgsPluginLayer.

18.1. Underklassning av QgsPluginLayer

Nedan visas ett exempel på en minimal implementering av QgsPluginLayer. Det är baserat på den ursprungliga koden för Watermark exempel plugin.

Den anpassade renderingen är den del av implementationen som definierar den faktiska ritningen på duken.

 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

Plugin-lagret kan läggas till i projektet och på canvas som vilket annat kartlager som helst:

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

När man laddar ett projekt som innehåller ett sådant lager behövs en fabriksklass:

 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)