优化视图管理

This commit is contained in:
徐海 2026-03-24 15:01:17 +08:00
parent 3e18a7dea0
commit 3d7b185afd
3 changed files with 83 additions and 95 deletions

View File

@ -258,7 +258,17 @@ void MainWindow::initAction()
dock_widget->setWidget(view); dock_widget->setWidget(view);
dock_widget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromDockWidget); dock_widget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromDockWidget);
if (view->IsDeleteOnClose()) { 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<MeasureAnalysisView*>(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 ) { if ( view->GetViewType() == MeasureAnalysisView::DataTable ) {
_menu_view_data_table_list->addAction(dock_widget->toggleViewAction()); _menu_view_data_table_list->addAction(dock_widget->toggleViewAction());
@ -268,10 +278,6 @@ void MainWindow::initAction()
} }
auto central_area = _dock_manager->centralWidget()->dockAreaWidget(); auto central_area = _dock_manager->centralWidget()->dockAreaWidget();
_dock_manager->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, dock_widget, central_area); _dock_manager->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, dock_widget, central_area);
} else {
if ( view->IsDeleteOnClose() ) {
delete view;
}
} }
} }
}); });

View File

@ -27,6 +27,20 @@ MeasureAnalysisTreeView::MeasureAnalysisTreeView(QWidget* parent)
connect(this, &QTreeView::doubleClicked, this, &MeasureAnalysisTreeView::onNodeDoubleClicked); 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) void MeasureAnalysisTreeView::onCustomContextMenuRequested(const QPoint& pos)
{ {
QModelIndex index = indexAt(pos); QModelIndex index = indexAt(pos);
@ -56,106 +70,73 @@ void MeasureAnalysisTreeView::onNodeDoubleClicked(const QModelIndex& index)
if (!analysis_type_data.isValid()) if (!analysis_type_data.isValid())
return; return;
AnalysisType analysis_type = analysis_type_data.value<AnalysisType>(); AnalysisType analysis_type = analysis_type_data.value<AnalysisType>();
QMap<QString, QVariant> data_files_set;
switch(analysis_type) { MeasureAnalysisView* view = nullptr;
case AnalysisType::ParticleData: { if ( _item_views.contains(item) ) {
MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); view = _item_views[item];
if (project_model) { } else {
auto file_name = project_model->GetAllChannelParticleDataFilename(); switch(analysis_type) {
if ( !file_name.isEmpty() ) { case AnalysisType::ParticleData: {
QMap<QString, QVariant> 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();
MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name);
if (project_model) { if (project_model) {
auto file_name = project_model->GetChannelAddressCountDataFilename(ch_num); auto file_name = project_model->GetAllChannelParticleDataFilename();
if ( !file_name.isEmpty() ) { if ( !file_name.isEmpty() ) {
QMap<QString, QVariant> data_files_set; data_files_set[QStringLiteral(u"粒子数据")] = file_name;
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);
}
} }
} }
} } break;
} break; case AnalysisType::AddressCountData: {
case AnalysisType::ParticleEnergyData: { QVariant ch_num_data = _model->GetNodeUserData(item, ProjectList::ChannelNum);
MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); if (ch_num_data.isValid()) {
if (project_model) { int ch_num = ch_num_data.toInt();
auto file_name = project_model->GetParticleEnergyDataFilename(); MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name);
if ( !file_name.isEmpty() ) { if (project_model) {
QMap<QString, QVariant> data_files_set; auto file_name = project_model->GetChannelAddressCountDataFilename(ch_num);
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<QString, QVariant> 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];
if ( !file_name.isEmpty() ) { 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) ) { } break;
view = _item_views[item]; case AnalysisType::ParticleEnergyData: {
} else { MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name);
view = MeasureAnalysisView::NewAnalyzeView(analysis_type); if (project_model) {
view->SetProjectName(project_name); auto file_name = project_model->GetParticleEnergyDataFilename();
const auto& view_name = QStringLiteral(u"%1[%2]").arg(item_text).arg(project_name); if ( !file_name.isEmpty() ) {
view->SetViewName(view_name); data_files_set[QStringLiteral(u"粒子能量数据")] = file_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::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; if (!data_files_set.isEmpty()) {
default: view = MeasureAnalysisView::NewAnalyzeView(analysis_type);
break; 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);
} }
} }

View File

@ -13,6 +13,7 @@ class MeasureAnalysisTreeView : public QTreeView
Q_OBJECT Q_OBJECT
public: public:
explicit MeasureAnalysisTreeView(QWidget *parent = nullptr); explicit MeasureAnalysisTreeView(QWidget *parent = nullptr);
void RemoveItemView(const QString& item_name);
private slots: private slots:
void onCustomContextMenuRequested(const QPoint &pos); void onCustomContextMenuRequested(const QPoint &pos);