跳转至

本节代码片段需导入以下模块:

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

from qgis.PyQt.QtGui import QImage

18 使用插件图层⚓︎

如果你的插件使用自己的方法渲染图层,基于QgsPluginLayer编写你自己的图层类型是最有效的方式。

18.1 子类化QgsPluginLayer⚓︎

下面例子是QgsPluginLayer的最小实现。它是基于Watermark example plugin的原版实现。

自定义渲染器是实现画布中实际图形工具的一部分。

 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
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

    # 可以添加读写项目特定信息的方法

    def readXml(self, node, context):
        pass

    def writeXml(self, node, doc, context):
        pass

可以将插件图层添加到项目中并作为任何其它图层添加到画布中:

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

加载包含此类图层的项目时,需要工厂类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class WatermarkPluginLayerType(QgsPluginLayerType):

    def __init__(self):
        super().__init__(WatermarkPluginLayer.LAYER_TYPE)

    def createLayer(self):
        return WatermarkPluginLayer()

    # 你可以添加GUI代码来自定义显示图层的属性信息
    def showLayerProperties(self, layer):
        pass


# 保持引用该实例,防止被垃圾回收
plt = WatermarkPluginLayerType()

assert QgsApplication.pluginLayerRegistry().addPluginLayerType(plt)