16.3. Usando Camadas de Complementos¶
Se o seu complemento usa seus próprios métodos para renderizar uma camada de mapa, escrever seu próprio tipo de camada com base em QgsPluginLayer
pode ser a melhor maneira de implementar isso.
16.3.1. Subclassificação QgsPluginLayer¶
Abaixo está um exemplo de uma implementação QgsPluginLayer mínima. É baseado no código original do complemento de exemplo de Marca de Água.
O renderizador personalizado é a parte do implemento que define o desenho real na tela.
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
|
A camada de complemento pode ser adicionada ao projeto e à tela como qualquer outra camada de mapa:
plugin_layer = WatermarkPluginLayer()
QgsProject.instance().addMapLayer(plugin_layer)
Ao carregar um projeto que contém essa camada, é necessária uma classe de fábrica:
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)
|