From efc09a587728302f5bed9f30ae2dc7da433932fe Mon Sep 17 00:00:00 2001 From: gaozheng Date: Tue, 16 Jun 2026 15:23:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(vtk):=20=E4=BA=8C=E7=BB=B4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=A0=8F=20widget(=E5=9C=B0=E5=9B=BE/2D?= =?UTF-8?q?=E8=A7=86=E5=9B=BE+=E8=87=AA=E5=AE=9A=E4=B9=89Z=E8=BE=93?= =?UTF-8?q?=E5=85=A5+2D=E5=88=97=E8=A1=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/CMakeLists.txt | 1 + src/app/panels/columns/Column2DDataset.cpp | 89 ++++++++++++++++++++++ src/app/panels/columns/Column2DDataset.hpp | 28 +++++++ 3 files changed, 118 insertions(+) create mode 100644 src/app/panels/columns/Column2DDataset.cpp create mode 100644 src/app/panels/columns/Column2DDataset.hpp diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 175f3bc..cbca01e 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -50,6 +50,7 @@ add_executable(geopro_desktop WIN32 panels/chart/ContourPlotItem.cpp panels/chart/LivePanner.cpp panels/chart/ScatterHoverTip.cpp + panels/columns/Column2DDataset.cpp panels/columns/Column3DDataset.cpp panels/AnomalyTablePanel.cpp panels/LoadingOverlay.cpp diff --git a/src/app/panels/columns/Column2DDataset.cpp b/src/app/panels/columns/Column2DDataset.cpp new file mode 100644 index 0000000..c149f81 --- /dev/null +++ b/src/app/panels/columns/Column2DDataset.cpp @@ -0,0 +1,89 @@ +#include "panels/columns/Column2DDataset.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Theme.hpp" +#include "panels/DatasetListPanel.hpp" + +namespace geopro::app { + +Column2DDataset::Column2DDataset(QWidget* parent) : QWidget(parent) { + auto* root = new QVBoxLayout(this); + root->setContentsMargins(space::kMd, space::kMd, space::kMd, space::kMd); + root->setSpacing(space::kMd); + + // 地图 + { + auto* form = new QFormLayout(); + auto* basemap = new QComboBox(); + basemap->addItem(QStringLiteral("天地图")); + basemap->addItem(QStringLiteral("Google Map")); + basemap->addItem(QStringLiteral("隐藏")); + connect(basemap, qOverload(&QComboBox::currentIndexChanged), this, + [this](int index) { emit basemapChanged(index); }); + form->addRow(QStringLiteral("底图源"), basemap); + root->addWidget(new QLabel(QStringLiteral("地图"))); + root->addLayout(form); + } + + // 2D视图 + { + auto* form = new QFormLayout(); + auto* view2d = new QComboBox(); + view2d->addItem(QStringLiteral("关闭")); + view2d->addItem(QStringLiteral("Z=0")); + view2d->addItem(QStringLiteral("顶部")); + view2d->addItem(QStringLiteral("底部")); + view2d->addItem(QStringLiteral("自定义")); + view2d->setCurrentIndex(1); + auto* zSpin = new QDoubleSpinBox(); + zSpin->setRange(-1000000, 1000000); + zSpin->setSuffix(QStringLiteral(" m")); + zSpin->setValue(0); + zSpin->setVisible(false); + connect(view2d, qOverload(&QComboBox::currentIndexChanged), this, + [this, zSpin](int idx) { + zSpin->setVisible(idx == 4); + emit view2DModeChanged(idx); + }); + connect(zSpin, qOverload(&QDoubleSpinBox::valueChanged), this, + [this](double z) { emit customZChanged(z); }); + form->addRow(QStringLiteral("位置"), view2d); + form->addRow(QStringLiteral("Z 值"), zSpin); + root->addWidget(new QLabel(QStringLiteral("2D视图"))); + root->addLayout(form); + } + + // 数据集列表(可勾选) + list_ = new QTreeWidget(); + list_->setHeaderHidden(true); + list_->setRootIsDecorated(true); + applyDatasetCardDelegate(list_); + connect(list_, &QTreeWidget::itemChanged, this, [this](QTreeWidgetItem*, int) { + QStringList ids; + for (QTreeWidgetItemIterator it(list_); *it; ++it) { + if ((*it)->checkState(0) == Qt::Checked) + ids << (*it)->data(0, kDsIdRole).toString(); + } + emit checkedDatasetsChanged(ids); + }); + root->addWidget(list_, 1); +} + +void Column2DDataset::setDatasets(const std::vector& rows) { + populateDatasetList(list_, rows, /*append=*/false); + for (QTreeWidgetItemIterator it(list_); *it; ++it) { + (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); + if ((*it)->checkState(0) != Qt::Checked) + (*it)->setCheckState(0, Qt::Unchecked); + } +} + +} // namespace geopro::app diff --git a/src/app/panels/columns/Column2DDataset.hpp b/src/app/panels/columns/Column2DDataset.hpp new file mode 100644 index 0000000..2e5d979 --- /dev/null +++ b/src/app/panels/columns/Column2DDataset.hpp @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include +#include "repo/RepoTypes.hpp" + +class QTreeWidget; + +namespace geopro::app { + +// 二维数据集栏:地图 + 2D视图(含自定义 Z) + 2D 数据集列表。 +class Column2DDataset : public QWidget { + Q_OBJECT +public: + explicit Column2DDataset(QWidget* parent = nullptr); + void setDatasets(const std::vector& rows); + +signals: + void basemapChanged(int index); // 0 天地图 / 1 Google / 2 隐藏 + void view2DModeChanged(int index); // 0 关闭 /1 Z=0 /2 顶部 /3 底部 /4 自定义 + void customZChanged(double z); // 世界绝对高程(米),向上为正 + void checkedDatasetsChanged(const QStringList& dsIds); + +private: + QTreeWidget* list_ = nullptr; +}; + +} // namespace geopro::app