feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
3 changed files with 39 additions and 5 deletions
Showing only changes of commit 9782a2b93e - Show all commits

View File

@ -124,6 +124,16 @@ if (-not $SkipDeploy) {
} finally { } finally {
if (-not $adsPreexisted) { Remove-Item $adsTmp -Force -ErrorAction SilentlyContinue } if (-not $adsPreexisted) { Remove-Item $adsTmp -Force -ErrorAction SilentlyContinue }
} }
# 中文化windeployqt --no-translations 不带翻译,单独拷 Qt 自带 zh_CNQMessageBox/QFileDialog
# 等标准按钮中文化app 启动按 exe 旁 translations\ 加载)。
$qtZh = Join-Path $QtBin '..\translations\qtbase_zh_CN.qm'
if (Test-Path $qtZh) {
$stageTr = Join-Path $StageDir 'translations'
New-Item -ItemType Directory -Force $stageTr | Out-Null
Copy-Item $qtZh $stageTr -Force
} else {
Warn "未找到 qtbase_zh_CN.qm$qtZh)—部署版标准按钮可能仍为英文"
}
} }
# --- 5.5 随包数据:本地样本演示数据 + PROJ 数据exe 旁布局,运行时相对定位)------- # --- 5.5 随包数据:本地样本演示数据 + PROJ 数据exe 旁布局,运行时相对定位)-------

View File

@ -55,9 +55,11 @@ QVBoxLayout* dialogRoot(QDialog* dlg);
// 与「数据详情 / 属性面板」同款的卡片面。返回 QFrame其 layout() 即 QVBoxLayout向内 addSection/addLayout。 // 与「数据详情 / 属性面板」同款的卡片面。返回 QFrame其 layout() 即 QVBoxLayout向内 addSection/addLayout。
QFrame* formCard(QWidget* parent); QFrame* formCard(QWidget* parent);
QVBoxLayout* cardBody(QFrame* card); // 取 formCard 的内层 QVBoxLayout便捷器 QVBoxLayout* cardBody(QFrame* card); // 取 formCard 的内层 QVBoxLayout便捷器
// 标准底部按钮栏QDialogButtonBox(Ok|Cancel),已接 accept/rejectokText/cancelText 可定制文案。 // 标准底部按钮栏QDialogButtonBox(Ok|Cancel),已接 accept/reject。
QDialogButtonBox* addDialogButtons(QVBoxLayout* root, QDialog* dlg, const QString& okText = QString(), // 默认中文「确定/取消」(不依赖 Qt 翻译是否就位);调用方可覆盖(如「生成/取消」)。
const QString& cancelText = QString()); QDialogButtonBox* addDialogButtons(QVBoxLayout* root, QDialog* dlg,
const QString& okText = QStringLiteral("确定"),
const QString& cancelText = QStringLiteral("取消"));
// ── 可编辑表单§7.0 统一度量DynamicFormEditor 与各参数对话框共用,单一真相)────── // ── 可编辑表单§7.0 统一度量DynamicFormEditor 与各参数对话框共用,单一真相)──────
QFormLayout* makeEditForm(); // 右对齐标签 + 标准行距/列距 QFormLayout* makeEditForm(); // 右对齐标签 + 标准行距/列距

View File

@ -50,10 +50,12 @@
#include <QListWidget> #include <QListWidget>
#include <QListWidgetItem> #include <QListWidgetItem>
#include <QJsonObject> #include <QJsonObject>
#include <QLibraryInfo>
#include <QMenu> #include <QMenu>
#include <QMessageBox> #include <QMessageBox>
#include <QPoint> #include <QPoint>
#include <QSet> #include <QSet>
#include <QTranslator>
#include <QToolButton> #include <QToolButton>
#include <QKeySequence> #include <QKeySequence>
#include <QProcess> #include <QProcess>
@ -829,9 +831,20 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
// 三维体段右键删除切片→deleteSlice / 异常→deleteAnomaly删后刷新树。 // 三维体段右键删除切片→deleteSlice / 异常→deleteAnomaly删后刷新树。
// 异常删除须同时 refreshAnomalies重载异常 actor——否则列表行没了但场景里异常仍渲染技术债已修 // 异常删除须同时 refreshAnomalies重载异常 actor——否则列表行没了但场景里异常仍渲染技术债已修
QObject::connect(analysisTab, &geopro::app::CategoryAnalysisTab::deleteDatasetRequested, &window, QObject::connect(analysisTab, &geopro::app::CategoryAnalysisTab::deleteDatasetRequested, &window,
[scene3dRepo, refreshAnalysis, refreshAnomalies](const QString& dsId, [scene3dRepo, refreshAnalysis, refreshAnomalies, &window](const QString& dsId,
const QString& ddCode) { const QString& ddCode) {
const std::string id = dsId.toStdString(); const std::string id = dsId.toStdString();
// 删除前确认(不可撤销):明确中文「删除/取消」按钮。
const QString what =
ddCode == QStringLiteral("dd_slice") ? QStringLiteral("切片")
: QStringLiteral("异常");
QMessageBox box(QMessageBox::Warning, QStringLiteral("删除%1").arg(what),
QStringLiteral("确定删除该%1吗此操作不可撤销。").arg(what),
QMessageBox::NoButton, &window);
QPushButton* del = box.addButton(QStringLiteral("删除"), QMessageBox::AcceptRole);
box.addButton(QStringLiteral("取消"), QMessageBox::RejectRole);
box.exec();
if (box.clickedButton() != del) return; // 取消 → 不删
if (ddCode == QStringLiteral("dd_slice")) { if (ddCode == QStringLiteral("dd_slice")) {
scene3dRepo->deleteSlice( scene3dRepo->deleteSlice(
id, [refreshAnalysis]() { refreshAnalysis(); }, id, [refreshAnalysis]() { refreshAnalysis(); },
@ -1978,6 +1991,15 @@ int main(int argc, char* argv[])
// (当前详情链路为同线程 DirectConnection非严格必需但作防御性注册见 spec §5.1)。 // (当前详情链路为同线程 DirectConnection非严格必需但作防御性注册见 spec §5.1)。
qRegisterMetaType<geopro::net::ApiResponse>(); qRegisterMetaType<geopro::net::ApiResponse>();
// Qt 标准控件文案中文化:安装 Qt 自带 zh_CN 翻译 → QMessageBox/QDialogButtonBox/QFileDialog/
// QColorDialog 等的 OK/Cancel/Yes/No/Save… 全局显示中文。translator 须存活至程序结束(放 main 栈)。
QTranslator qtZhTranslator;
const QString appTr = QCoreApplication::applicationDirPath() + QStringLiteral("/translations");
if (qtZhTranslator.load(QStringLiteral("qtbase_zh_CN"), appTr) || // 部署版(exe 旁)
qtZhTranslator.load(QStringLiteral("qtbase_zh_CN"),
QLibraryInfo::path(QLibraryInfo::TranslationsPath))) // dev(Qt 安装)
app.installTranslator(&qtZhTranslator);
// 组织/应用名QSettings 持久化dock 布局、登录记忆等)按此定位存储位置。 // 组织/应用名QSettings 持久化dock 布局、登录记忆等)按此定位存储位置。
QCoreApplication::setOrganizationName(QStringLiteral("Geomative")); QCoreApplication::setOrganizationName(QStringLiteral("Geomative"));
QCoreApplication::setApplicationName(QStringLiteral("Geopro3")); QCoreApplication::setApplicationName(QStringLiteral("Geopro3"));