16.3. Plug-in-lagen gebruiken¶
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.
16.3.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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class WatermarkLayerRenderer(QgsMapLayerRenderer):
def __init__(self, layerId, rendererContext):
super().__init__(layerId, rendererContext)
def render(self):
image = QImage("/usr/share/icons/hicolor/128x128/apps/qgis.png")
painter = self.renderContext().painter()
painter.save()
painter.drawImage(10, 10, image)
painter.restore()
return True
class WatermarkPluginLayer(QgsPluginLayer):
LAYER_TYPE="watermark"
def __init__(self):
super().__init__(WatermarkPluginLayer.LAYER_TYPE, "Watermark plugin layer")
self.setValid(True)
def createMapRenderer(self, rendererContext):
return WatermarkLayerRenderer(self.id(), rendererContext)
def setTransformContext(self, ct):
pass
# Methods for reading and writing specific information to the project file can
# also be added:
def readXml(self, node, context):
pass
def writeXml(self, node, doc, context):
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class WatermarkPluginLayerType(QgsPluginLayerType):
def __init__(self):
super().__init__(WatermarkPluginLayer.LAYER_TYPE)
def createLayer(self):
return WatermarkPluginLayer()
# You can also add GUI code for displaying custom information
# in the layer properties
def showLayerProperties(self, layer):
pass
# Keep a reference to the instance in Python so it won't
# be garbage collected
plt = WatermarkPluginLayerType()
assert QgsApplication.pluginLayerRegistry().addPluginLayerType(plt)
|