chore(ela): 去掉 GEOPRO_UI_SHELL 兜底开关 + 新增开源 NOTICE

- main: 删除 env 选壳分支与经典 QMainWindow 回退, ElaWindow 成为唯一外壳(迁移已稳定)
- NOTICE.md: 列出第三方组件与许可证(Qt LGPL / VTK BSD / ADS LGPL / ElaWidgetTools MIT /
  QtKeychain BSD) 及合规要点、Ela 版本钉定说明
This commit is contained in:
gaozheng 2026-06-10 12:02:43 +08:00
parent cfd39e5be8
commit e3a1b18efa
2 changed files with 55 additions and 41 deletions

28
NOTICE.md Normal file
View File

@ -0,0 +1,28 @@
# 第三方组件与许可证 (Third-Party Notices)
本项目geopro / Geopro 3.0 桌面端)使用了以下第三方开源组件。各组件版权归其各自作者所有,
按其各自许可证条款分发。
| 组件 | 用途 | 许可证 | 来源 |
|---|---|---|---|
| **Qt 6** (6.11.x) | GUI 框架Widgets/Gui/Core/Network/Svg/OpenGL 等) | LGPL-3.0(亦提供商业许可) | https://www.qt.io |
| **VTK** (9.x) | 三维/二维可视化渲染 | BSD-3-Clause | https://vtk.org |
| **Qt-Advanced-Docking-System** (4.3.1) | 停靠面板布局 | LGPL-2.1 | https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System |
| **ElaWidgetTools** | Fluent UI 控件(菜单/列表/表单/图标等) | MIT | https://github.com/Liniyous/ElaWidgetTools Qt6.10+ 支持取自 fork https://github.com/RainbowCandyX/ElaWidgetTools |
| **QtKeychain** (0.14.0) | 凭证安全存取("记住登录" | BSD-3-Clause | https://github.com/frankosterfeld/qtkeychain |
## 许可证要点
- **Qt 6 / Qt-Advanced-Docking-SystemLGPL**:本项目以动态链接方式使用 Qt 与 ADS符合 LGPL
对动态链接的要求;如需替换这些库,最终用户可自行替换对应动态库。若改为静态链接或分发修改版,
需遵循 LGPL 的相应义务(提供目标代码/重新链接能力)。
- **ElaWidgetToolsMIT**以静态库方式集成MIT 允许静态链接与闭源分发,需保留版权声明与许可证文本。
- **VTK / QtKeychainBSD-3-Clause**:需在分发物中保留版权声明与许可证文本,不得用作者名背书。
> 各组件完整许可证文本随其源码分发FetchContent 拉取于 build 目录的 `_deps/<组件>-src/`
> 或随 Qt/VTK 安装目录)。如需在发行包中附带完整 LICENSE 文本,请从对应来源复制。
## ElaWidgetTools 版本钉定
为保证可复现构建ElaWidgetTools 钉定到提交
`b80eadc4a199186e14656dce09959b3216a593be`(见 `CMakeLists.txt``FetchContent_Declare(elawidgettools ...)`)。

View File

@ -1099,49 +1099,35 @@ int main(int argc, char* argv[])
geopro::data::ApiProjectRepository projectRepo(api); geopro::data::ApiProjectRepository projectRepo(api);
geopro::controller::WorkbenchNavController nav(projectRepo); geopro::controller::WorkbenchNavController nav(projectRepo);
// ── 外壳选择P1 迁移可回退GEOPRO_UI_SHELL=ela → Fluent ElaWindow 壳; // ── 外壳Fluent ElaWindow唯一路径。ElaWindow 用 addPageNode 包裹一个承载工作台的内层
// 未设/其它 → 经典 QMainWindow 壳。两者都复用同一 buildWorkbench(QMainWindow&)。 // QMainWindowbuildWorkbench 依赖 QMainWindow 的 setCentralWidget/setMenuWidget/statusBar
// Ela 壳策略ElaWindow 用 setCentralCustomWidget 包裹一个承载工作台的内层 QMainWindow
// buildWorkbench 依赖 QMainWindow 的 setCentralWidget/setMenuWidget/statusBar
// ElaWindow 自身将其设为私有,故用内层 QMainWindow 承接,零改 buildWorkbench // ElaWindow 自身将其设为私有,故用内层 QMainWindow 承接,零改 buildWorkbench
const QString kTitle = QStringLiteral("Geopro 3.0 — 项目分析视图 (M1)"); const QString kTitle = QStringLiteral("Geopro 3.0 — 项目分析视图 (M1)");
QWidget* topLevel = nullptr;
if (qEnvironmentVariable("GEOPRO_UI_SHELL") == QLatin1String("ela")) {
auto* ela = new ElaWindow; auto* ela = new ElaWindow;
ela->setWindowTitle(kTitle); ela->setWindowTitle(kTitle);
ela->resize(1280, 800); ela->resize(1280, 800);
ela->setMinimumSize(1024, 680); ela->setMinimumSize(1024, 680);
ela->setIsNavigationBarEnable(false); // 纯中心内容,不显示左侧导航栏 ela->setIsNavigationBarEnable(false); // 纯中心内容,不显示左侧导航栏
ela->setAppBarHeight(38); // 默认 45 偏大,收紧标题栏更接近原生 ela->setAppBarHeight(38); // 默认 45 偏大,收紧标题栏更接近原生
auto* inner = new QMainWindow(ela); // 以 ela 为父,避免无父期调色板/DPI 抖动(review H3) auto* inner = new QMainWindow(ela); // 以 ela 为父,避免无父期调色板/DPI 抖动
buildWorkbench(*inner, repo, projectRepo, nav); buildWorkbench(*inner, repo, projectRepo, nav);
// 用 addPageNode 把工作台作为唯一页面放进中心页栈(填满到底边)。 // 用 addPageNode 把工作台作为唯一页面放进中心页栈(填满到底边)。
// 注意:不能用 setCentralCustomWidget——它把控件插到页栈容器“之上”空页栈仍占底部 // 注意:不能用 setCentralCustomWidget——它把控件插到页栈容器“之上”空页栈仍占底部
// 导致状态栏不贴底边(见 ElaCentralStackedWidget::setCustomWidget 的 insertWidget(0,...))。 // 导致状态栏不贴底边(见 ElaCentralStackedWidget::setCustomWidget 的 insertWidget(0,...))。
ela->addPageNode(kTitle, inner); ela->addPageNode(kTitle, inner);
// ── P2 主题桥ElaTheme 明/暗切换 → 同步全局 QSS+调色板(覆盖所有标准控件与 ADS // 主题桥ElaTheme 明/暗切换 → 同步全局 QSS+调色板(覆盖所有标准控件与 ADS
// Ela 自家控件由 ElaTheme 自动换肤;这里补齐非 Ela 面。也确定了主题最终态(解 review C2)。
QObject::connect(eTheme, &ElaTheme::themeModeChanged, ela, [&app](ElaThemeType::ThemeMode m) { QObject::connect(eTheme, &ElaTheme::themeModeChanged, ela, [&app](ElaThemeType::ThemeMode m) {
geopro::app::applyThemeMode(app, m == ElaThemeType::Dark); geopro::app::applyThemeMode(app, m == ElaThemeType::Dark);
}); });
geopro::app::applyThemeMode(app, eTheme->getThemeMode() == ElaThemeType::Dark); // 初始对齐 geopro::app::applyThemeMode(app, eTheme->getThemeMode() == ElaThemeType::Dark); // 初始对齐
// 主题切换快捷键 Ctrl+Shift+T正式切换入口待 P3 TopBar Ela 化后加按钮)。 // 主题切换快捷键 Ctrl+Shift+T标题栏亦有 Ela 自带的明暗切换键)。
auto* themeSc = new QShortcut(QKeySequence(QStringLiteral("Ctrl+Shift+T")), ela); auto* themeSc = new QShortcut(QKeySequence(QStringLiteral("Ctrl+Shift+T")), ela);
QObject::connect(themeSc, &QShortcut::activated, ela, [] { QObject::connect(themeSc, &QShortcut::activated, ela, [] {
eTheme->setThemeMode(eTheme->getThemeMode() == ElaThemeType::Light ? ElaThemeType::Dark eTheme->setThemeMode(eTheme->getThemeMode() == ElaThemeType::Light ? ElaThemeType::Dark
: ElaThemeType::Light); : ElaThemeType::Light);
}); });
topLevel = ela; ela->show();
} else {
auto* window = new QMainWindow;
window->setWindowTitle(kTitle);
window->resize(1280, 800);
window->setMinimumSize(1024, 680); // 防止停靠面板被压到不可用尺寸
buildWorkbench(*window, repo, projectRepo, nav);
topLevel = window;
}
topLevel->show();
nav.start(); // 进入工作台后拉真实 空间/项目/结构 nav.start(); // 进入工作台后拉真实 空间/项目/结构