实现了TOC右键菜单:移除图层

This commit is contained in:
tangchao0503
2026-03-05 14:15:18 +08:00
parent 8d2fe91043
commit 7f94513a16
12 changed files with 220 additions and 5 deletions

View File

@ -10,9 +10,17 @@
#include "RasterLayer.h" #include "RasterLayer.h"
#include "LayerTreeLayerNode.h" #include "LayerTreeLayerNode.h"
HPPA* HPPA::s_instance = nullptr;
HPPA* HPPA::instance()
{
return s_instance;
}
HPPA::HPPA(QWidget* parent) HPPA::HPPA(QWidget* parent)
: QMainWindow(parent) : QMainWindow(parent)
{ {
s_instance = this;
ui.setupUi(this); ui.setupUi(this);
// register MapLayer* metatype for queued signal/slot across threads // 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"); auto* g2 = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Vector");
//model->addLayer(g2, "Rivers"); //model->addLayer(g2, "Rivers");
QTreeView* LayerTreeView = new QTreeView(); m_layerTreeView = new LayerTreeView();
LayerTreeView->setModel(m_LayerTreeModel); LayerTreeViewMenuProvider* tttt = new LayerTreeViewMenuProvider(m_layerTreeView);
LayerTreeView->setHeaderHidden(true); m_layerTreeView->setMenuProvider(tttt);
LayerTreeView->setStyleSheet(R"( m_layerTreeView->setModel(m_LayerTreeModel);
m_layerTreeView->setHeaderHidden(true);
m_layerTreeView->setStyleSheet(R"(
QTreeView QTreeView
{ {
color: #ACCDFF; 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_layers->setWidget(dock_layersWidgetContents);
dock_layersWidgetContents->setStyleSheet(qss_DockWidget_contentWidget); dock_layersWidgetContents->setStyleSheet(qss_DockWidget_contentWidget);
@ -855,6 +865,52 @@ HPPA::~HPPA()
//m_Imager->~ResononNirImager();//释放资源 //m_Imager->~ResononNirImager();//释放资源
delete m_Imager; 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<LayerTreeModel*>(static_cast<const LayerTreeModel*>(currentIndexTmp.model()));
if (!model) return;
LayerTreeNode* node = static_cast<LayerTreeNode*>(currentIndexTmp.internalPointer());
if (!node || node->type() != LayerTreeNode::Type::Layer) return;
auto* layerNode = static_cast<LayerTreeLayerNode*>(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() void HPPA::initPanelToolbar()

View File

@ -56,6 +56,9 @@
#include "MapLayer.h" #include "MapLayer.h"
#include "MapLayerStore.h" #include "MapLayerStore.h"
#include "LayerTreeView.h"
#include "LayerTreeViewMenuProvider.h"
#define PI 3.1415926 #define PI 3.1415926
QT_CHARTS_USE_NAMESPACE//QChartView 使用 需要加宏, 否则无法使用 QT_CHARTS_USE_NAMESPACE//QChartView 使用 需要加宏, 否则无法使用
@ -170,11 +173,14 @@ public:
HPPA(QWidget *parent = Q_NULLPTR); HPPA(QWidget *parent = Q_NULLPTR);
~HPPA(); ~HPPA();
static HPPA* instance();
void CalculateIntegratioinTimeRange();//通过帧率计算积分时间范围设置slider最大值 void CalculateIntegratioinTimeRange();//通过帧率计算积分时间范围设置slider最大值
WorkerThread * m_TestImagerStausThread;//检测相机连接状态的线程 WorkerThread * m_TestImagerStausThread;//检测相机连接状态的线程
private: private:
static HPPA* s_instance;
Ui::HPPAClass ui; Ui::HPPAClass ui;
QTabWidget* m_imageViewerTabWidget; QTabWidget* m_imageViewerTabWidget;
@ -256,6 +262,7 @@ private:
View3DModelManager* m_view3DModelManager; View3DModelManager* m_view3DModelManager;
LayerTreeView* m_layerTreeView;
LayerTree* m_LayerTree = nullptr; LayerTree* m_LayerTree = nullptr;
LayerTreeModel* m_LayerTreeModel = nullptr; LayerTreeModel* m_LayerTreeModel = nullptr;
LayerTreeNode* m_RasterGroup = nullptr; // 指向 "Raster" 分组,便于后续添加 layer LayerTreeNode* m_RasterGroup = nullptr; // 指向 "Raster" 分组,便于后续添加 layer
@ -321,6 +328,7 @@ public Q_SLOTS:
void onImageFileSaved(QString path, int fileIndex); void onImageFileSaved(QString path, int fileIndex);
void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex); void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex);
void removeLayerByTreeIndex();
signals: signals:
void StartFocusSignal(); void StartFocusSignal();

View File

@ -119,6 +119,8 @@
<ClCompile Include="LayerTreeLayerNode.cpp" /> <ClCompile Include="LayerTreeLayerNode.cpp" />
<ClCompile Include="LayerTreeModel.cpp" /> <ClCompile Include="LayerTreeModel.cpp" />
<ClCompile Include="LayerTreeNode.cpp" /> <ClCompile Include="LayerTreeNode.cpp" />
<ClCompile Include="LayerTreeView.cpp" />
<ClCompile Include="LayerTreeViewMenuProvider.cpp" />
<ClCompile Include="MapLayer.cpp" /> <ClCompile Include="MapLayer.cpp" />
<ClCompile Include="MapLayerStore.cpp" /> <ClCompile Include="MapLayerStore.cpp" />
<ClCompile Include="OneMotorControl.cpp" /> <ClCompile Include="OneMotorControl.cpp" />
@ -198,6 +200,8 @@
<QtMoc Include="MapLayer.h" /> <QtMoc Include="MapLayer.h" />
<QtMoc Include="RasterLayer.h" /> <QtMoc Include="RasterLayer.h" />
<QtMoc Include="MapLayerStore.h" /> <QtMoc Include="MapLayerStore.h" />
<ClInclude Include="LayerTreeView.h" />
<QtMoc Include="LayerTreeViewMenuProvider.h" />
<ClInclude Include="RasterDataProvider.h" /> <ClInclude Include="RasterDataProvider.h" />
<ClInclude Include="RasterRenderer.h" /> <ClInclude Include="RasterRenderer.h" />
<ClInclude Include="utility_tc.h" /> <ClInclude Include="utility_tc.h" />

View File

@ -169,6 +169,12 @@
<ClCompile Include="MapLayerStore.cpp"> <ClCompile Include="MapLayerStore.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="LayerTreeView.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LayerTreeViewMenuProvider.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="fileOperation.h"> <QtMoc Include="fileOperation.h">
@ -267,6 +273,9 @@
<QtMoc Include="MapLayerStore.h"> <QtMoc Include="MapLayerStore.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="LayerTreeViewMenuProvider.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="imageProcessor.h"> <ClInclude Include="imageProcessor.h">
@ -305,6 +314,9 @@
<ClInclude Include="RasterRenderer.h"> <ClInclude Include="RasterRenderer.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="LayerTreeView.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtUic Include="FocusDialog.ui"> <QtUic Include="FocusDialog.ui">

View File

@ -156,6 +156,19 @@ bool LayerTreeModel::cascadeCheckEnabled() const
return m_cascadeCheck; return m_cascadeCheck;
} }
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>֣<EFBFBD><D6A3>Ƴ<EFBFBD><C6B3>ӽڵ㲢<DAB5><E3B2A2> model <20>Ϸ<EFBFBD><CFB7><EFBFBD> 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 LayerTreeNode* LayerTreeModel::nodeFromIndex(const QModelIndex& index) const
{ {
if (!index.isValid()) return m_tree->root(); if (!index.isValid()) return m_tree->root();

View File

@ -39,6 +39,9 @@ public:
void setCascadeCheckEnabled(bool enabled); void setCascadeCheckEnabled(bool enabled);
bool cascadeCheckEnabled() const; bool cascadeCheckEnabled() const;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><D3B8>ڵ<EFBFBD><DAB5>Ƴ<EFBFBD><C6B3>ӽڵ㣨<DAB5><E3A3A8>װ LayerTree::removeNode <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> model ֪ͨ<CDA8><D6AA>
LayerTreeNode* removeNode(LayerTreeNode* parent, int row);
private: private:
LayerTree* m_tree = nullptr; // not owned LayerTree* m_tree = nullptr; // not owned
bool m_cascadeCheck = true; bool m_cascadeCheck = true;

32
HPPA/LayerTreeView.cpp Normal file
View File

@ -0,0 +1,32 @@
#include "LayerTreeView.h"
#include "LayerTreeViewMenuProvider.h"
#include <QContextMenuEvent>
#include <QMenu>
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);
}

20
HPPA/LayerTreeView.h Normal file
View File

@ -0,0 +1,20 @@
#pragma once
#include <QTreeView>
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
};

View File

@ -0,0 +1,38 @@
#include "LayerTreeViewMenuProvider.h"
#include "LayerTreeView.h"
#include "LayerTreeModel.h"
#include "LayerTreeNode.h"
#include "HPPA.h"
#include <QAction>
#include <QDebug>
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<const LayerTreeModel*>(m_contextIndex.model());
if (model)
{
LayerTreeNode* node = static_cast<LayerTreeNode*>(m_contextIndex.internalPointer());
if (node && node->type() == LayerTreeNode::Type::Layer)
{
QAction* removeAction = new QAction(QStringLiteral("<EFBFBD>Ƴ<EFBFBD>ͼ<EFBFBD><EFBFBD>"), menu);
connect(removeAction, &QAction::triggered, HPPA::instance(), &HPPA::removeLayerByTreeIndex);
menu->addAction(removeAction);
}
}
}
return menu;
}

View File

@ -0,0 +1,24 @@
#pragma once
#include <QMenu>
#include <QObject>
#include <QModelIndex>
class LayerTreeView;
class LayerTreeModel;
class MapLayer;
class LayerTreeViewMenuProvider : public QObject
{
Q_OBJECT
public:
explicit LayerTreeViewMenuProvider(LayerTreeView* view, QObject* parent = nullptr);
~LayerTreeViewMenuProvider() override = default;
// <20><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD> index <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߸<EFBFBD><DFB8><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> QMenu*
QMenu* createContextMenu();
private:
LayerTreeView* m_view = nullptr; // not owned
QModelIndex m_contextIndex;
};

View File

@ -8,6 +8,10 @@ RasterLayer::RasterLayer(const QString& name, const QString& uri)
// lazy creation // lazy creation
} }
RasterLayer::~RasterLayer()
{
}
MapLayer::LayerType RasterLayer::layerType() const MapLayer::LayerType RasterLayer::layerType() const
{ {
return MapLayer::LayerType::Raster; return MapLayer::LayerType::Raster;

View File

@ -12,6 +12,7 @@ class RasterLayer : public MapLayer
Q_OBJECT Q_OBJECT
public: public:
explicit RasterLayer(const QString& name, const QString& uri); explicit RasterLayer(const QString& name, const QString& uri);
~RasterLayer();
LayerType layerType() const override; LayerType layerType() const override;