16.3. Utilisation de la classe QgsPluginLayer

Si votre plugin utilise ses propres méthodes pour le rendu des couches, la meilleure façon de l’implémenter passe par l’écriture de vos propres types en vous basant sur la classe QgsPluginLayer

16.3.1. Héritage de la classe QgsPluginLayer

Vous trouverez ci dessous un exemple simple d’implémentation de la classe QgsPluginLayer, basé sur le code de l’extension Watermark

Le moteur de rendu personnalisé est la partie de l’implémentation qui définit le redu réel dans le canevas de carte.

 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

Le plugin layer peux être ajouté a un projet et à la carte comme n’importe quelle autre couche :

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

Quand vous chargez un projet contenant ce type de couches, une classe constructeur est necessaire

 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)