QGIS为我们提供了默认的图层管理器,我们需要绑定图层树和画布,然后向图层树中添加图层,画布和图层视图都会显示添加的数据。

为此,先删除之前设计界面时添加的 List View,找到frame_prev_layers删除其中的list_view,并修改其layoutNamelayout_prev_layers,稍后会向该布局中添加图层视图。

修改init_qgis_map方法,添加如下代码

def init_qgis_map(main):
# 初始化画布
main.preview_canvas = QgsMapCanvas()
main.preview_canvas.setDestinationCrs(QgsCoordinateReferenceSystem("EPSG:4326"))
main.preview_canvas.setCanvasColor(Qt.white)
main.preview_canvas.enableAntiAliasing(True)
main.preview_canvas.setFocus()
main.preview_canvas.setParallelRenderingEnabled(True)
# 添加到布局中
main.ui.preview_qgis_map.addWidget(main.preview_canvas)

# 初始化工具
main.preview_tool_pan = QgsMapToolPan(main.preview_canvas)
main.preview_tool_zoom_in = QgsMapToolZoom(main.preview_canvas, False)
main.preview_tool_zoom_out = QgsMapToolZoom(main.preview_canvas, True)
# 默认使用移动工具
main.preview_canvas.setMapTool(main.preview_tool_pan)

# 初始化图层管理器
# 创建图层树视图,然后添加到界面中
main.layerTreeView = QgsLayerTreeView(main)
main.ui.layout_prev_layers.addWidget(main.layerTreeView)
# 树节点
main.model = QgsLayerTreeModel(QgsProject.instance().layerTreeRoot(), main)
main.model.setFlag(QgsLayerTreeModel.AllowNodeRename) # 允许图层节点重命名
main.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) # 允许图层拖拽排序
main.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) # 允许改变图层节点可视性
main.model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) # 展示图例
main.model.setAutoCollapseLegendNodes(10) # 当节点数大于等于10时自动折叠
main.layerTreeView.setModel(main.model)
# 4 建立图层树与地图画布的桥接
main.layerTreeBridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), main.preview_canvas, main)

界面运行效果如下: