From 3d7b185afdae189d73982af4bb6bda04a8823be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B5=B7?= Date: Tue, 24 Mar 2026 15:01:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=86=E5=9B=BE=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MainWindow.cpp | 16 +++- src/MeasureAnalysisTreeView.cpp | 161 ++++++++++++++------------------ src/MeasureAnalysisTreeView.h | 1 + 3 files changed, 83 insertions(+), 95 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 5051976..8c9f8ad 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -258,7 +258,17 @@ void MainWindow::initAction() dock_widget->setWidget(view); dock_widget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromDockWidget); if (view->IsDeleteOnClose()) { - dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::DockWidgetDeleteOnClose); + // dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::DockWidgetDeleteOnClose); + dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::CustomCloseHandling); + connect(dock_widget, &CDockWidget::closeRequested, [this, dock_widget, view](){ + MeasureAnalysisView* dock_view = dynamic_cast(dock_widget->widget()); + if ( dock_view ) { + const QString& view_name = view->GetViewName(); + if (dock_view->GetViewName() == view_name) { + _tree_measure_analysis->RemoveItemView(view_name); + } + } + }); } if ( view->GetViewType() == MeasureAnalysisView::DataTable ) { _menu_view_data_table_list->addAction(dock_widget->toggleViewAction()); @@ -268,10 +278,6 @@ void MainWindow::initAction() } auto central_area = _dock_manager->centralWidget()->dockAreaWidget(); _dock_manager->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, dock_widget, central_area); - } else { - if ( view->IsDeleteOnClose() ) { - delete view; - } } } }); diff --git a/src/MeasureAnalysisTreeView.cpp b/src/MeasureAnalysisTreeView.cpp index 5a148a9..00e4b5d 100644 --- a/src/MeasureAnalysisTreeView.cpp +++ b/src/MeasureAnalysisTreeView.cpp @@ -27,6 +27,20 @@ MeasureAnalysisTreeView::MeasureAnalysisTreeView(QWidget* parent) connect(this, &QTreeView::doubleClicked, this, &MeasureAnalysisTreeView::onNodeDoubleClicked); } +void MeasureAnalysisTreeView::RemoveItemView(const QString &item_name) +{ + for (auto it = _item_views.constBegin(); it!=_item_views.constEnd(); ++it ) { + MeasureAnalysisView* view = it.value(); + if (view) { + if ( view->GetViewName() == item_name ) { + emit removeItemView(view); + _item_views.remove(it.key()); + return; + } + } + } +} + void MeasureAnalysisTreeView::onCustomContextMenuRequested(const QPoint& pos) { QModelIndex index = indexAt(pos); @@ -56,106 +70,73 @@ void MeasureAnalysisTreeView::onNodeDoubleClicked(const QModelIndex& index) if (!analysis_type_data.isValid()) return; AnalysisType analysis_type = analysis_type_data.value(); - - switch(analysis_type) { - case AnalysisType::ParticleData: { - MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); - if (project_model) { - auto file_name = project_model->GetAllChannelParticleDataFilename(); - if ( !file_name.isEmpty() ) { - QMap data_files_set; - data_files_set[QStringLiteral(u"粒子数据")] = file_name; - MeasureAnalysisView* view = MeasureAnalysisView::NewAnalyzeView(analysis_type); - if ( view ) { - view->SetProjectName(project_name); - const auto& view_name = QStringLiteral(u"%1[%2]").arg(item_text).arg(project_name); - view->SetViewName(view_name); - view->SetViewDescription(view_name); - view->InitViewWorkspace(project_name); - view->SetAnalyzeDataFilename(data_files_set); - emit currentItemView(view); - } - } - } - } break; - case AnalysisType::AddressCountData: { - QVariant ch_num_data = _model->GetNodeUserData(item, ProjectList::ChannelNum); - if (ch_num_data.isValid()) { - int ch_num = ch_num_data.toInt(); + QMap data_files_set; + MeasureAnalysisView* view = nullptr; + if ( _item_views.contains(item) ) { + view = _item_views[item]; + } else { + switch(analysis_type) { + case AnalysisType::ParticleData: { MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); if (project_model) { - auto file_name = project_model->GetChannelAddressCountDataFilename(ch_num); + auto file_name = project_model->GetAllChannelParticleDataFilename(); if ( !file_name.isEmpty() ) { - QMap data_files_set; - data_files_set[QStringLiteral(u"通道%1道址计数").arg(ch_num)] = file_name; - MeasureAnalysisView* view = MeasureAnalysisView::NewAnalyzeView(analysis_type); - if ( view ) { - view->SetProjectName(project_name); - const auto& view_name = QStringLiteral(u"%1[%2]").arg(item_text).arg(project_name); - view->SetViewName(view_name); - view->SetViewDescription(view_name); - view->InitViewWorkspace(project_name); - view->SetAnalyzeDataFilename(data_files_set); - emit currentItemView(view); - } + data_files_set[QStringLiteral(u"粒子数据")] = file_name; } } - } - } break; - case AnalysisType::ParticleEnergyData: { - MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); - if (project_model) { - auto file_name = project_model->GetParticleEnergyDataFilename(); - if ( !file_name.isEmpty() ) { - QMap data_files_set; - data_files_set[QStringLiteral(u"粒子能量数据")] = file_name; - MeasureAnalysisView* view = MeasureAnalysisView::NewAnalyzeView(analysis_type); - if ( view ) { - view->SetProjectName(project_name); - const auto& view_name = QStringLiteral(u"%1[%2]").arg(item_text).arg(project_name); - view->SetViewName(view_name); - view->SetViewDescription(view_name); - view->InitViewWorkspace(project_name); - view->SetAnalyzeDataFilename(data_files_set); - emit currentItemView(view); - } - } - } - } break; - case AnalysisType::AddressCountSpectrumView: { - MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); - if (project_model) { - auto file_name_list = project_model->GetChannelAddressCountDataFilenameList(); - if ( !file_name_list.isEmpty() ) { - QMap data_files_set; - auto ch_num_list = file_name_list.keys(); - for(auto ch_num : ch_num_list) { - auto file_name = file_name_list[ch_num]; + } break; + case AnalysisType::AddressCountData: { + QVariant ch_num_data = _model->GetNodeUserData(item, ProjectList::ChannelNum); + if (ch_num_data.isValid()) { + int ch_num = ch_num_data.toInt(); + MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); + if (project_model) { + auto file_name = project_model->GetChannelAddressCountDataFilename(ch_num); if ( !file_name.isEmpty() ) { - data_files_set[QStringLiteral(u"通道%1").arg(ch_num)] = file_name; + data_files_set[QStringLiteral(u"通道%1道址计数").arg(ch_num)] = file_name; } } - MeasureAnalysisView* view = nullptr; - if ( _item_views.contains(item) ) { - view = _item_views[item]; - } else { - view = MeasureAnalysisView::NewAnalyzeView(analysis_type); - view->SetProjectName(project_name); - const auto& view_name = QStringLiteral(u"%1[%2]").arg(item_text).arg(project_name); - view->SetViewName(view_name); - view->SetViewDescription(view_name); - view->InitViewWorkspace(project_name); - view->SetAnalyzeDataFilename(data_files_set); - - } - if ( view ) { - _item_views[item] = view; - emit currentItemView(view); + } + } break; + case AnalysisType::ParticleEnergyData: { + MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); + if (project_model) { + auto file_name = project_model->GetParticleEnergyDataFilename(); + if ( !file_name.isEmpty() ) { + data_files_set[QStringLiteral(u"粒子能量数据")] = file_name; } } + } break; + case AnalysisType::AddressCountSpectrumView: { + MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); + if (project_model) { + auto file_name_list = project_model->GetChannelAddressCountDataFilenameList(); + if ( !file_name_list.isEmpty() ) { + auto ch_num_list = file_name_list.keys(); + for(auto ch_num : ch_num_list) { + auto file_name = file_name_list[ch_num]; + if ( !file_name.isEmpty() ) { + data_files_set[QStringLiteral(u"通道%1").arg(ch_num)] = file_name; + } + } + } + } + } break; + default: + break; } - } break; - default: - break; + if (!data_files_set.isEmpty()) { + view = MeasureAnalysisView::NewAnalyzeView(analysis_type); + view->SetProjectName(project_name); + const auto& view_name = QStringLiteral(u"%1[%2]").arg(item_text).arg(project_name); + view->SetViewName(view_name); + view->SetViewDescription(view_name); + view->InitViewWorkspace(project_name); + view->SetAnalyzeDataFilename(data_files_set); + } + } + if ( view ) { + _item_views[item] = view; + emit currentItemView(view); } } diff --git a/src/MeasureAnalysisTreeView.h b/src/MeasureAnalysisTreeView.h index 84841c7..a918ac8 100644 --- a/src/MeasureAnalysisTreeView.h +++ b/src/MeasureAnalysisTreeView.h @@ -13,6 +13,7 @@ class MeasureAnalysisTreeView : public QTreeView Q_OBJECT public: explicit MeasureAnalysisTreeView(QWidget *parent = nullptr); + void RemoveItemView(const QString& item_name); private slots: void onCustomContextMenuRequested(const QPoint &pos);