refactor/pure-qt-ui #3

Merged
gaozheng merged 56 commits from refactor/pure-qt-ui into main 2026-06-10 18:41:53 +08:00
4 changed files with 38 additions and 6 deletions
Showing only changes of commit f5eff9e185 - Show all commits

View File

@ -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) {

View File

@ -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;

View File

@ -93,6 +93,9 @@ void applyTheme(QApplication& app);
// 当前 ElaTheme 是否暗色(供内联样式判断)。
bool isDarkTheme();
// VTK 渲染器背景色(随当前主题,取 ElaTheme 窗口底色)。写入 r/g/b01
void vtkBackground(double& r, double& g, double& b);
// 把一段「浅色设计稿 QSS」按当前 ElaTheme 配色着色应用到 widget并随明/暗切换自动重着色。
// 用于 TopBar/PanelHeader/浮层 等带内联 setStyleSheet 的自定义 chrome——让它们也跟随主题
// (设计稿里用浅色令牌 #1F2A3D/#FFFFFF/#2D6CB5… 书写即可,与全局 QSS 同一套角色映射)。

View File

@ -62,6 +62,7 @@
#include <DockWidget.h>
#include <ElaApplication.h>
#include <ElaCheckBox.h>
#include <ElaDef.h>
#include <ElaTheme.h>
#include <ElaWindow.h>
@ -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<vtkGenericOpenGLRenderWindow> detailRenderWindow;
vtkNew<vtkRenderer> 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);