实现了TOC右键菜单:移除图层
This commit is contained in:
@ -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<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()
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -119,6 +119,8 @@
|
||||
<ClCompile Include="LayerTreeLayerNode.cpp" />
|
||||
<ClCompile Include="LayerTreeModel.cpp" />
|
||||
<ClCompile Include="LayerTreeNode.cpp" />
|
||||
<ClCompile Include="LayerTreeView.cpp" />
|
||||
<ClCompile Include="LayerTreeViewMenuProvider.cpp" />
|
||||
<ClCompile Include="MapLayer.cpp" />
|
||||
<ClCompile Include="MapLayerStore.cpp" />
|
||||
<ClCompile Include="OneMotorControl.cpp" />
|
||||
@ -198,6 +200,8 @@
|
||||
<QtMoc Include="MapLayer.h" />
|
||||
<QtMoc Include="RasterLayer.h" />
|
||||
<QtMoc Include="MapLayerStore.h" />
|
||||
<ClInclude Include="LayerTreeView.h" />
|
||||
<QtMoc Include="LayerTreeViewMenuProvider.h" />
|
||||
<ClInclude Include="RasterDataProvider.h" />
|
||||
<ClInclude Include="RasterRenderer.h" />
|
||||
<ClInclude Include="utility_tc.h" />
|
||||
|
||||
@ -169,6 +169,12 @@
|
||||
<ClCompile Include="MapLayerStore.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="LayerTreeView.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="LayerTreeViewMenuProvider.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtMoc Include="fileOperation.h">
|
||||
@ -267,6 +273,9 @@
|
||||
<QtMoc Include="MapLayerStore.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="LayerTreeViewMenuProvider.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</QtMoc>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="imageProcessor.h">
|
||||
@ -305,6 +314,9 @@
|
||||
<ClInclude Include="RasterRenderer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="LayerTreeView.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtUic Include="FocusDialog.ui">
|
||||
|
||||
@ -156,6 +156,19 @@ bool LayerTreeModel::cascadeCheckEnabled() const
|
||||
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
|
||||
{
|
||||
if (!index.isValid()) return m_tree->root();
|
||||
|
||||
@ -39,6 +39,9 @@ public:
|
||||
void setCascadeCheckEnabled(bool enabled);
|
||||
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:
|
||||
LayerTree* m_tree = nullptr; // not owned
|
||||
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
|
||||
}
|
||||
|
||||
RasterLayer::~RasterLayer()
|
||||
{
|
||||
}
|
||||
|
||||
MapLayer::LayerType RasterLayer::layerType() const
|
||||
{
|
||||
return MapLayer::LayerType::Raster;
|
||||
|
||||
@ -12,6 +12,7 @@ class RasterLayer : public MapLayer
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit RasterLayer(const QString& name, const QString& uri);
|
||||
~RasterLayer();
|
||||
|
||||
LayerType layerType() const override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user