From 7f94513a16f1ebd31fa78d413bf73e0e59931bff Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Thu, 5 Mar 2026 14:15:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86TOC=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E8=8F=9C=E5=8D=95=EF=BC=9A=E7=A7=BB=E9=99=A4=E5=9B=BE?= =?UTF-8?q?=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HPPA/HPPA.cpp | 66 +++++++++++++++++++++++++++--- HPPA/HPPA.h | 8 ++++ HPPA/HPPA.vcxproj | 4 ++ HPPA/HPPA.vcxproj.filters | 12 ++++++ HPPA/LayerTreeModel.cpp | 13 ++++++ HPPA/LayerTreeModel.h | 3 ++ HPPA/LayerTreeView.cpp | 32 +++++++++++++++ HPPA/LayerTreeView.h | 20 +++++++++ HPPA/LayerTreeViewMenuProvider.cpp | 38 +++++++++++++++++ HPPA/LayerTreeViewMenuProvider.h | 24 +++++++++++ HPPA/RasterLayer.cpp | 4 ++ HPPA/RasterLayer.h | 1 + 12 files changed, 220 insertions(+), 5 deletions(-) create mode 100644 HPPA/LayerTreeView.cpp create mode 100644 HPPA/LayerTreeView.h create mode 100644 HPPA/LayerTreeViewMenuProvider.cpp create mode 100644 HPPA/LayerTreeViewMenuProvider.h diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index bea44f1..4c955c7 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -10,9 +10,17 @@ #include "RasterLayer.h" #include "LayerTreeLayerNode.h" +HPPA* HPPA::s_instance = nullptr; + +HPPA* HPPA::instance() +{ + return s_instance; +} + HPPA::HPPA(QWidget* parent) : QMainWindow(parent) { + s_instance = this; ui.setupUi(this); // register MapLayer* metatype for queued signal/slot across threads @@ -230,10 +238,12 @@ sizePolicy1.setHeightForWidth(graphicsView_delete->sizePolicy().hasHeightForWidt auto* g2 = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Vector"); //model->addLayer(g2, "Rivers"); - QTreeView* LayerTreeView = new QTreeView(); - LayerTreeView->setModel(m_LayerTreeModel); - LayerTreeView->setHeaderHidden(true); - LayerTreeView->setStyleSheet(R"( + m_layerTreeView = new LayerTreeView(); + LayerTreeViewMenuProvider* tttt = new LayerTreeViewMenuProvider(m_layerTreeView); + m_layerTreeView->setMenuProvider(tttt); + m_layerTreeView->setModel(m_LayerTreeModel); + m_layerTreeView->setHeaderHidden(true); + m_layerTreeView->setStyleSheet(R"( QTreeView { color: #ACCDFF; @@ -256,7 +266,7 @@ sizePolicy1.setHeightForWidth(graphicsView_delete->sizePolicy().hasHeightForWidt } )"); - gridLayout_toc->addWidget(LayerTreeView, 0, 0, 1, 1); + gridLayout_toc->addWidget(m_layerTreeView, 0, 0, 1, 1); dock_layers->setWidget(dock_layersWidgetContents); dock_layersWidgetContents->setStyleSheet(qss_DockWidget_contentWidget); @@ -855,6 +865,52 @@ HPPA::~HPPA() //m_Imager->~ResononNirImager();//释放资源 delete m_Imager; } + + if (s_instance == this) + { + s_instance = nullptr; + } +} + +void HPPA::removeLayerByTreeIndex() +{ + QModelIndex currentIndexTmp = m_layerTreeView->currentIndex(); + + if (!currentIndexTmp.isValid()) return; + + LayerTreeModel* model = const_cast(static_cast(currentIndexTmp.model())); + if (!model) return; + + LayerTreeNode* node = static_cast(currentIndexTmp.internalPointer()); + if (!node || node->type() != LayerTreeNode::Type::Layer) return; + + auto* layerNode = static_cast(node); + MapLayer* mapLayer = layerNode->mapLayer(); + QWidget* layerWidget = nullptr; + + if (mapLayer && m_MapLayerStore) + { + layerWidget = m_MapLayerStore->widgetForLayer(mapLayer); + m_MapLayerStore->removeLayer(mapLayer); + } + + if (layerWidget && m_imageViewerTabWidget) + { + const int tabIndex = m_imageViewerTabWidget->indexOf(layerWidget); + if (tabIndex >= 0) + { + m_imageViewerTabWidget->removeTab(tabIndex); + } + layerWidget->deleteLater(); + } + + LayerTreeNode* parent = node->parentNode(); + int row = node->rowInParent(); + LayerTreeNode* removed = model->removeNode(parent, row); + if (removed) + { + delete removed; + } } void HPPA::initPanelToolbar() diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index e3ece65..75757c6 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -56,6 +56,9 @@ #include "MapLayer.h" #include "MapLayerStore.h" +#include "LayerTreeView.h" +#include "LayerTreeViewMenuProvider.h" + #define PI 3.1415926 QT_CHARTS_USE_NAMESPACE//QChartView 使用 需要加宏, 否则无法使用 @@ -170,11 +173,14 @@ public: HPPA(QWidget *parent = Q_NULLPTR); ~HPPA(); + static HPPA* instance(); + void CalculateIntegratioinTimeRange();//通过帧率计算积分时间范围,设置slider最大值 WorkerThread * m_TestImagerStausThread;//检测相机连接状态的线程 private: + static HPPA* s_instance; Ui::HPPAClass ui; QTabWidget* m_imageViewerTabWidget; @@ -256,6 +262,7 @@ private: View3DModelManager* m_view3DModelManager; + LayerTreeView* m_layerTreeView; LayerTree* m_LayerTree = nullptr; LayerTreeModel* m_LayerTreeModel = nullptr; LayerTreeNode* m_RasterGroup = nullptr; // 指向 "Raster" 分组,便于后续添加 layer @@ -321,6 +328,7 @@ public Q_SLOTS: void onImageFileSaved(QString path, int fileIndex); void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex); + void removeLayerByTreeIndex(); signals: void StartFocusSignal(); diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index 65c5a03..c212057 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -119,6 +119,8 @@ + + @@ -198,6 +200,8 @@ + + diff --git a/HPPA/HPPA.vcxproj.filters b/HPPA/HPPA.vcxproj.filters index daca754..4e1da3c 100644 --- a/HPPA/HPPA.vcxproj.filters +++ b/HPPA/HPPA.vcxproj.filters @@ -169,6 +169,12 @@ Source Files + + Source Files + + + Source Files + @@ -267,6 +273,9 @@ Header Files + + Header Files + @@ -305,6 +314,9 @@ Header Files + + Header Files + diff --git a/HPPA/LayerTreeModel.cpp b/HPPA/LayerTreeModel.cpp index d2096ba..c848b81 100644 --- a/HPPA/LayerTreeModel.cpp +++ b/HPPA/LayerTreeModel.cpp @@ -156,6 +156,19 @@ bool LayerTreeModel::cascadeCheckEnabled() const return m_cascadeCheck; } +// ʵ֣Ƴӽڵ㲢 model Ϸ begin/endRemoveRows +LayerTreeNode* LayerTreeModel::removeNode(LayerTreeNode* parent, int row) +{ + if (!parent) parent = m_tree->root(); + if (row < 0 || row >= parent->childCount()) return nullptr; + + beginRemoveRows(indexFromNode(parent), row, row); + LayerTreeNode* removed = m_tree->removeNode(parent, row); + endRemoveRows(); + + return removed; +} + LayerTreeNode* LayerTreeModel::nodeFromIndex(const QModelIndex& index) const { if (!index.isValid()) return m_tree->root(); diff --git a/HPPA/LayerTreeModel.h b/HPPA/LayerTreeModel.h index 17a64bb..b618298 100644 --- a/HPPA/LayerTreeModel.h +++ b/HPPA/LayerTreeModel.h @@ -39,6 +39,9 @@ public: void setCascadeCheckEnabled(bool enabled); bool cascadeCheckEnabled() const; + // ӸڵƳӽڵ㣨װ LayerTree::removeNode model ֪ͨ + LayerTreeNode* removeNode(LayerTreeNode* parent, int row); + private: LayerTree* m_tree = nullptr; // not owned bool m_cascadeCheck = true; diff --git a/HPPA/LayerTreeView.cpp b/HPPA/LayerTreeView.cpp new file mode 100644 index 0000000..99bf798 --- /dev/null +++ b/HPPA/LayerTreeView.cpp @@ -0,0 +1,32 @@ +#include "LayerTreeView.h" +#include "LayerTreeViewMenuProvider.h" +#include +#include + +LayerTreeView::LayerTreeView(QWidget* parent) + : QTreeView(parent), m_menuProvider(nullptr) +{ +} + +void LayerTreeView::setMenuProvider(LayerTreeViewMenuProvider* provider) +{ + m_menuProvider = provider; +} + +void LayerTreeView::contextMenuEvent(QContextMenuEvent* event) +{ + if (!m_menuProvider) + return; + + const QModelIndex idx = indexAt(event->pos()); + if (!idx.isValid()) + setCurrentIndex(QModelIndex()); + + QMenu* menu = m_menuProvider->createContextMenu(); + if (menu) + { + menu->exec(event->globalPos()); + delete menu; + } + //QTreeView::contextMenuEvent(event); +} diff --git a/HPPA/LayerTreeView.h b/HPPA/LayerTreeView.h new file mode 100644 index 0000000..ab9df88 --- /dev/null +++ b/HPPA/LayerTreeView.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +class LayerTreeViewMenuProvider; + +class LayerTreeView : public QTreeView +{ +public: + explicit LayerTreeView(QWidget* parent = nullptr); + ~LayerTreeView() override = default; + + void setMenuProvider(LayerTreeViewMenuProvider* provider); + +protected: + void contextMenuEvent(QContextMenuEvent* event) override; + +private: + LayerTreeViewMenuProvider* m_menuProvider = nullptr; // not owned +}; diff --git a/HPPA/LayerTreeViewMenuProvider.cpp b/HPPA/LayerTreeViewMenuProvider.cpp new file mode 100644 index 0000000..69ef512 --- /dev/null +++ b/HPPA/LayerTreeViewMenuProvider.cpp @@ -0,0 +1,38 @@ +#include "LayerTreeViewMenuProvider.h" +#include "LayerTreeView.h" +#include "LayerTreeModel.h" +#include "LayerTreeNode.h" +#include "HPPA.h" +#include +#include + +LayerTreeViewMenuProvider::LayerTreeViewMenuProvider(LayerTreeView* view, QObject* parent) + : QObject(parent), m_view(view) +{ +} + +QMenu* LayerTreeViewMenuProvider::createContextMenu() +{ + m_contextIndex = m_view->currentIndex(); + + QMenu* menu = new QMenu(); + + // Always allow remove when index is valid and points to a Layer + if (m_contextIndex.isValid()) + { + // determine node type by looking at model's node + const LayerTreeModel* model = static_cast(m_contextIndex.model()); + if (model) + { + LayerTreeNode* node = static_cast(m_contextIndex.internalPointer()); + if (node && node->type() == LayerTreeNode::Type::Layer) + { + QAction* removeAction = new QAction(QStringLiteral("Ƴͼ"), menu); + connect(removeAction, &QAction::triggered, HPPA::instance(), &HPPA::removeLayerByTreeIndex); + menu->addAction(removeAction); + } + } + } + + return menu; +} diff --git a/HPPA/LayerTreeViewMenuProvider.h b/HPPA/LayerTreeViewMenuProvider.h new file mode 100644 index 0000000..b1d56a0 --- /dev/null +++ b/HPPA/LayerTreeViewMenuProvider.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +class LayerTreeView; +class LayerTreeModel; +class MapLayer; + +class LayerTreeViewMenuProvider : public QObject +{ + Q_OBJECT +public: + explicit LayerTreeViewMenuProvider(LayerTreeView* view, QObject* parent = nullptr); + ~LayerTreeViewMenuProvider() override = default; + + // ݸ index һ˵߸ɾص QMenu* + QMenu* createContextMenu(); + +private: + LayerTreeView* m_view = nullptr; // not owned + QModelIndex m_contextIndex; +}; diff --git a/HPPA/RasterLayer.cpp b/HPPA/RasterLayer.cpp index fee8c6b..11c2244 100644 --- a/HPPA/RasterLayer.cpp +++ b/HPPA/RasterLayer.cpp @@ -8,6 +8,10 @@ RasterLayer::RasterLayer(const QString& name, const QString& uri) // lazy creation } +RasterLayer::~RasterLayer() +{ +} + MapLayer::LayerType RasterLayer::layerType() const { return MapLayer::LayerType::Raster; diff --git a/HPPA/RasterLayer.h b/HPPA/RasterLayer.h index 776a732..9f46bc0 100644 --- a/HPPA/RasterLayer.h +++ b/HPPA/RasterLayer.h @@ -12,6 +12,7 @@ class RasterLayer : public MapLayer Q_OBJECT public: explicit RasterLayer(const QString& name, const QString& uri); + ~RasterLayer(); LayerType layerType() const override;