本节代码片段需导入以下模块:
| 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
|
可以将插件图层添加到项目中并作为任何其它图层添加到画布中:
| 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)
|