From f5eff9e185a339a9485e7e953ed5bc96a8872771 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Wed, 10 Jun 2026 09:17:45 +0800 Subject: [PATCH] =?UTF-8?q?feat(ela):=20C=20VTK=20=E8=A7=86=E5=8F=A3?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E9=9A=8F=E4=B8=BB=E9=A2=98=20+=20A=20?= =?UTF-8?q?=E6=B5=AE=E5=B1=82=E5=8B=BE=E9=80=89=E6=A1=86=20Ela=20=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - vtkBackground(): 取 ElaTheme 窗口底色; CentralScene/详情渲染器初始用它; 切主题时中央+详情重设+刷新 - 浮层图层勾选(帘面/体素/切片/地形) → ElaCheckBox - 说明: 自定义 chrome(工作空间/项目切换器/图标按钮/PanelHeader tab/工具条)保留并随主题(强换 Ela 会丢设计); 状态栏由 QSS 随主题 --- src/app/CentralScene.cpp | 7 ++++++- src/app/Theme.cpp | 8 ++++++++ src/app/Theme.hpp | 3 +++ src/app/main.cpp | 26 +++++++++++++++++++++----- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/app/CentralScene.cpp b/src/app/CentralScene.cpp index 2579151..a80e951 100644 --- a/src/app/CentralScene.cpp +++ b/src/app/CentralScene.cpp @@ -6,6 +6,7 @@ #include "CameraPreset.hpp" #include "Scene.hpp" +#include "Theme.hpp" #include "actors/CurtainActor.hpp" #include "actors/MapLineActor.hpp" #include "geo/GeoLocalFrame.hpp" @@ -18,7 +19,11 @@ void rebuildCentralScene(geopro::render::Scene& scene, vtkRenderer* renderer, const geopro::core::GeoLocalFrame& frame, double verticalExaggeration) { scene.clear(); const bool is2D = (mode == ViewMode::Map2D); - renderer->SetBackground(is2D ? 0.96 : 1.0, is2D ? 0.97 : 1.0, is2D ? 0.99 : 1.0); + (void)is2D; + // 背景随主题(取 ElaTheme 窗口底色),暗色下不再是刺眼白底。 + double bgR, bgG, bgB; + geopro::app::vtkBackground(bgR, bgG, bgB); + renderer->SetBackground(bgR, bgG, bgB); for (const auto& s : sections) { if (is2D) { diff --git a/src/app/Theme.cpp b/src/app/Theme.cpp index 9a9a314..a27b0fb 100644 --- a/src/app/Theme.cpp +++ b/src/app/Theme.cpp @@ -467,6 +467,14 @@ bool isDarkTheme() return eTheme->getThemeMode() == ElaThemeType::Dark; } +void vtkBackground(double& r, double& g, double& b) +{ + const QColor c = roleColor(isDarkTheme(), ElaThemeType::WindowBase); + r = c.redF(); + g = c.greenF(); + b = c.blueF(); +} + void applyThemedStyleSheet(QWidget* w, const QString& designQss) { if (!w) return; diff --git a/src/app/Theme.hpp b/src/app/Theme.hpp index 295b7d0..3fa7ab7 100644 --- a/src/app/Theme.hpp +++ b/src/app/Theme.hpp @@ -93,6 +93,9 @@ void applyTheme(QApplication& app); // 当前 ElaTheme 是否暗色(供内联样式判断)。 bool isDarkTheme(); +// VTK 渲染器背景色(随当前主题,取 ElaTheme 窗口底色)。写入 r/g/b(0–1)。 +void vtkBackground(double& r, double& g, double& b); + // 把一段「浅色设计稿 QSS」按当前 ElaTheme 配色着色应用到 widget,并随明/暗切换自动重着色。 // 用于 TopBar/PanelHeader/浮层 等带内联 setStyleSheet 的自定义 chrome——让它们也跟随主题 // (设计稿里用浅色令牌 #1F2A3D/#FFFFFF/#2D6CB5… 书写即可,与全局 QSS 同一套角色映射)。 diff --git a/src/app/main.cpp b/src/app/main.cpp index 1b5e087..5117475 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -62,6 +62,7 @@ #include #include +#include #include #include #include @@ -348,13 +349,13 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re "padding-bottom:3px;font-size:%2px;") .arg(geopro::app::type::kWeightSemibold) .arg(geopro::app::type::kTitle)); - auto* chkCurtain = new QCheckBox(QStringLiteral("帘面(断面墙)")); + auto* chkCurtain = new ElaCheckBox(QStringLiteral("帘面(断面墙)")); chkCurtain->setChecked(true); - auto* chkVoxel = new QCheckBox(QStringLiteral("体素(dd_voxel)")); + auto* chkVoxel = new ElaCheckBox(QStringLiteral("体素(dd_voxel)")); chkVoxel->setChecked(false); - auto* chkTerrain = new QCheckBox(QStringLiteral("地形(DEM+影像)")); + auto* chkTerrain = new ElaCheckBox(QStringLiteral("地形(DEM+影像)")); chkTerrain->setChecked(false); - auto* chkSlice = new QCheckBox(QStringLiteral("切片(dd_slice)")); + auto* chkSlice = new ElaCheckBox(QStringLiteral("切片(dd_slice)")); chkSlice->setChecked(false); if (!crs) { // PROJ 不可用 → 体素/切片/地形层(都需配准)禁用并提示 const QString tip = QStringLiteral("PROJ 数据(proj.db)缺失,配准不可用"); @@ -433,12 +434,27 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re auto* detailWidget = new QVTKOpenGLStereoWidget(); vtkNew detailRenderWindow; vtkNew detailRenderer; - detailRenderer->SetBackground(1.0, 1.0, 1.0); // 白底 + { + double r, g, b; + geopro::app::vtkBackground(r, g, b); // 背景随主题 + detailRenderer->SetBackground(r, g, b); + } detailWidget->setRenderWindow(detailRenderWindow); detailRenderWindow->AddRenderer(detailRenderer); vtkRenderer* detailRendererPtr = detailRenderer.Get(); vtkGenericOpenGLRenderWindow* detailRenderWindowPtr = detailRenderWindow.Get(); + // VTK 背景随主题切换:ElaTheme 明/暗切换时,中央+详情渲染器重设底色并刷新。 + QObject::connect(eTheme, &ElaTheme::themeModeChanged, detailWidget, + [rendererPtr, renderWindowPtr, detailRendererPtr, detailRenderWindowPtr]() { + double r, g, b; + geopro::app::vtkBackground(r, g, b); + rendererPtr->SetBackground(r, g, b); + renderWindowPtr->Render(); + detailRendererPtr->SetBackground(r, g, b); + detailRenderWindowPtr->Render(); + }); + // 数据详情容器:顶部「反演剖面/原数据」工具条 + 下方 QVTK 小视图。 auto* detailContainer = new QWidget(); auto* detailLayout = new QVBoxLayout(detailContainer);