From 88d2fea9df73bbe59b07b05a62ce48a61fc3f501 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 11 Jun 2026 12:09:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20DatasetDetailPanel=20=E5=A4=9ATab?= =?UTF-8?q?=E5=A3=B3(=E6=8C=89dsId=E5=8E=BB=E9=87=8D+=E5=8F=8D=E5=90=91?= =?UTF-8?q?=E8=81=94=E5=8A=A8=E4=BF=A1=E5=8F=B7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/CMakeLists.txt | 1 + src/app/panels/DatasetDetailPanel.cpp | 30 +++++++++++++++++++++++++++ src/app/panels/DatasetDetailPanel.hpp | 19 +++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 src/app/panels/DatasetDetailPanel.cpp create mode 100644 src/app/panels/DatasetDetailPanel.hpp diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 328fd2b..ea0f23a 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -29,6 +29,7 @@ add_executable(geopro_desktop WIN32 panels/chart/DatasetChartView.cpp panels/AnomalyTablePanel.cpp panels/DatasetDetailPage.cpp + panels/DatasetDetailPanel.cpp CentralScene.cpp ProjectListDialog.cpp SettingsDialog.cpp) diff --git a/src/app/panels/DatasetDetailPanel.cpp b/src/app/panels/DatasetDetailPanel.cpp new file mode 100644 index 0000000..4f3e59f --- /dev/null +++ b/src/app/panels/DatasetDetailPanel.cpp @@ -0,0 +1,30 @@ +#include "panels/DatasetDetailPanel.hpp" +#include "panels/DatasetDetailPage.hpp" +namespace geopro::app { + +DatasetDetailPanel::DatasetDetailPanel(QWidget* parent) : QTabWidget(parent) { + setTabsClosable(true); + connect(this, &QTabWidget::tabCloseRequested, this, [this](int i) { delete widget(i); }); + connect(this, &QTabWidget::currentChanged, this, [this](int i) { + if (auto* p = qobject_cast(widget(i))) + emit activeDatasetChanged(p->dsId()); + }); +} + +DatasetDetailPage* DatasetDetailPanel::pageFor(const QString& dsId) const { + for (int i = 0; i < count(); ++i) + if (auto* p = qobject_cast(widget(i))) + if (p->dsId() == dsId) return p; + return nullptr; +} + +void DatasetDetailPanel::openOrUpdate(const geopro::controller::DatasetDetailController::ChartData& d) { + auto* p = pageFor(d.dsId); + if (!p) { p = new DatasetDetailPage(this); addTab(p, d.dsId); } // 标题后续可换 ds 名 + p->setData(d); + setCurrentWidget(p); +} +void DatasetDetailPanel::focusDataset(const QString& dsId) { + if (auto* p = pageFor(dsId)) setCurrentWidget(p); +} +} // namespace geopro::app diff --git a/src/app/panels/DatasetDetailPanel.hpp b/src/app/panels/DatasetDetailPanel.hpp new file mode 100644 index 0000000..3df160a --- /dev/null +++ b/src/app/panels/DatasetDetailPanel.hpp @@ -0,0 +1,19 @@ +#pragma once +#include +#include "DatasetDetailController.hpp" +namespace geopro::app { +class DatasetDetailPage; + +// 多 Tab 壳:每数据集一页(按 dsId 去重)。R095。 +class DatasetDetailPanel : public QTabWidget { + Q_OBJECT +public: + explicit DatasetDetailPanel(QWidget* parent = nullptr); + void openOrUpdate(const geopro::controller::DatasetDetailController::ChartData& d); // 双击/数据到达 + void focusDataset(const QString& dsId); // 单击聚焦已开页 +signals: + void activeDatasetChanged(const QString& dsId); // 反向联动数据集列表 +private: + DatasetDetailPage* pageFor(const QString& dsId) const; +}; +} // namespace geopro::app