#include "windLayerTreeViewMenuProvider.h" #include "qgslayertreeviewdefaultactions.h" #include #include #include "qgslayertreenode.h" #include "qgslayertree.h" #include "qgsvectorlayer.h" #include "qgsmapcanvas.h" #include "qgsrasterlayerproperties.h" #include "qgsgui.h" #include "qgsproviderguiregistry.h" #include "qgsmeshlayerproperties.h" windLayerTreeViewMenuProvider::windLayerTreeViewMenuProvider(QgsLayerTreeView* view, QgsMapCanvas* canvas, QObject* parent) : QObject(parent) , mLayerTreeView(view) , mMapCanvas(canvas) { } QMenu* windLayerTreeViewMenuProvider::createContextMenu() { // 创建空的菜单 QMenu* menu = new QMenu(); // 获取图层树视图的默认操作集合,它包含了许多常用的菜单项实现 QgsLayerTreeViewDefaultActions* actions = mLayerTreeView->defaultActions(); // 获取当前鼠标位置对应的模型索引 QModelIndex index = mLayerTreeView->currentIndex(); // 情况1:在空白处右键(未选中任何节点) if (!index.isValid()) { menu->addAction(actions->actionAddGroup(menu)); menu->addAction(tr("&Expand All"), mLayerTreeView, &QgsLayerTreeView::expandAll); menu->addAction(tr("&Collapse All"), mLayerTreeView, &QgsLayerTreeView::collapseAll); return menu; } // 将索引转换为图层树节点 QgsLayerTreeNode* node = mLayerTreeView->index2node(index); if (!node) { return menu; // 如果转换失败,返回空菜单 } // 情况2:右键点击的是图层组 if (QgsLayerTree::isGroup(node)) { menu->addAction(actions->actionZoomToGroup(mMapCanvas, menu)); menu->addAction(actions->actionRemoveGroupOrLayer(menu)); menu->addAction(actions->actionRenameGroupOrLayer(menu)); } else if (QgsLayerTree::isLayer(node)) { menu->addAction(actions->actionZoomToLayers(mMapCanvas, menu)); menu->addAction(actions->actionZoomToSelection(mMapCanvas, menu)); menu->addAction(actions->actionRenameGroupOrLayer(menu)); menu->addAction(actions->actionShowInOverview(menu)); menu->addAction(actions->actionRemoveGroupOrLayer(menu)); QgsMapLayer* mapLayer = QgsLayerTree::toLayer(node)->layer(); if (mapLayer) { // 添加"缩放到图层"动作 menu->addAction(actions->actionZoomToLayers(mMapCanvas, menu)); // 添加"删除图层"和"重命名图层"动作 menu->addAction(actions->actionRemoveGroupOrLayer(menu)); menu->addAction(actions->actionRenameGroupOrLayer(menu)); menu->addSeparator(); if (mapLayer->type() == Qgis::LayerType::Raster) { QAction* rasterLayerPropertyAction = menu->addAction(u8"属性"); QObject::connect(rasterLayerPropertyAction, &QAction::triggered, this, &windLayerTreeViewMenuProvider::showlayerpropertyDialog); } else if (mapLayer->type() == Qgis::LayerType::Mesh) { QAction* meshLayerPropertyAction = menu->addAction(u8"属性"); QObject::connect(meshLayerPropertyAction, &QAction::triggered, this, &windLayerTreeViewMenuProvider::showlayerpropertyDialog); } } } return menu; // 返回构建好的菜单 } void windLayerTreeViewMenuProvider::showlayerpropertyDialog(bool flag) { QgsMapLayer* mapLayer = mLayerTreeView->currentLayer(); if (!mapLayer) { return; } if (mapLayer->type()==Qgis::LayerType::Raster) { // collect factories from registered data providers QList providerFactories = QgsGui::providerGuiRegistry()->mapLayerConfigWidgetFactories(mapLayer); QgsRasterLayerProperties* rasterLayerPropertiesDialog = new QgsRasterLayerProperties(mapLayer, mMapCanvas, mMapCanvas); for (const QgsMapLayerConfigWidgetFactory* factory : std::as_const(providerFactories)) { rasterLayerPropertiesDialog->addPropertiesPageFactory(factory); } rasterLayerPropertiesDialog->restoreLastPage(); rasterLayerPropertiesDialog->setModal(true); rasterLayerPropertiesDialog->show(); connect(rasterLayerPropertiesDialog, &QgsRasterLayerProperties::accepted, [rasterLayerPropertiesDialog] { rasterLayerPropertiesDialog->deleteLater(); }); connect(rasterLayerPropertiesDialog, &QgsRasterLayerProperties::rejected, [rasterLayerPropertiesDialog] { rasterLayerPropertiesDialog->deleteLater(); }); } else if (mapLayer->type() == Qgis::LayerType::Mesh) { QList providerFactories = QgsGui::providerGuiRegistry()->mapLayerConfigWidgetFactories(mapLayer); QgsMeshLayerProperties meshLayerPropertiesDialog(mapLayer, mMapCanvas, mMapCanvas); for (const QgsMapLayerConfigWidgetFactory* factory : std::as_const(providerFactories)) { meshLayerPropertiesDialog.addPropertiesPageFactory(factory); } meshLayerPropertiesDialog.restoreLastPage(); meshLayerPropertiesDialog.exec(); } }