在PYQGIS——图层目录树右键菜单一文中我们实现了怎么添加图层目录树的上下文菜单,我们来添加一个open Attribute Table菜单代码片段如下:
... layer = self.layerTreeView.currentLayer() if layer.type() == QgsMapLayerType.VectorLayer: # 矢量图层 actionOpenAttributeDialog = QAction('open Attribute Table', menu) actionOpenAttributeDialog.triggered.connect(lambda: self.openAttributeDialog(layer)) menu.addAction(actionOpenAttributeDialog) else: # 栅格图层 pass ...接下来来实现该菜单的具体功能,具体原理请参考这里,直接给出python代码:
def openAttributeDialog(self, layer): self.attributeDialog = AttributeDialog(self.mapCanvas) self.attributeDialog.openAttributeDialog(layer) self.attributeDialog.show()其中,属性对话框AttributeDialog的代码如下:
# -*- coding: utf-8 -*- # @Author : llc # @Time : 2020/10/20 15:01 from PyQt5.QtWidgets import QDialog, QHBoxLayout from qgis.core import QgsVectorLayerCache from qgis.gui import QgsAttributeTableView, QgsAttributeTableModel, QgsAttributeTableFilterModel class AttributeDialog(QDialog): def __init__(self, mapCanvas, parent=None): super().__init__(parent) self.mapCanvas = mapCanvas self.resize(600, 400) self.tableView = QgsAttributeTableView(self) self.hl = QHBoxLayout(self) self.hl.addWidget(self.tableView) def openAttributeDialog(self, layer): self.layerCache = QgsVectorLayerCache(layer, layer.featureCount()) self.tableModel = QgsAttributeTableModel(self.layerCache) self.tableModel.loadLayer() self.tableFilterModel = QgsAttributeTableFilterModel(self.mapCanvas, self.tableModel, parent=self.tableModel) self.tableFilterModel.setFilterMode(QgsAttributeTableFilterModel.ShowAll) self.tableView.setModel(self.tableFilterModel)实现效果图如下: 本文源码地址:点这里