实现了TOC右键菜单:移除图层
This commit is contained in:
@ -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()
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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" />
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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
32
HPPA/LayerTreeView.cpp
Normal 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
20
HPPA/LayerTreeView.h
Normal 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
|
||||||
|
};
|
||||||
38
HPPA/LayerTreeViewMenuProvider.cpp
Normal file
38
HPPA/LayerTreeViewMenuProvider.cpp
Normal 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;
|
||||||
|
}
|
||||||
24
HPPA/LayerTreeViewMenuProvider.h
Normal file
24
HPPA/LayerTreeViewMenuProvider.h
Normal 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;
|
||||||
|
};
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user