From 27905511e6b85670a1bacb2e9f82c8a31eba5528 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Tue, 23 Jun 2026 18:56:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(vtk):=20=E7=A9=BA=E6=80=81=E6=B5=AE?= =?UTF-8?q?=E5=B1=82=E9=92=B3=E8=BF=9B=E8=A7=86=E5=9B=BE=E4=B8=8D=E6=BA=A2?= =?UTF-8?q?=E5=87=BA+=E6=96=87=E6=A1=88=E6=9B=B4=E6=96=B0;=E5=88=87?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=B8=85=E7=A9=BA=E4=B8=AD=E5=A4=AE=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CenterOverlay::reposition 钳制浮层尺寸≤host、偏移取非负,缩小子视图时不再超界; 空态标题/提示改为与当前功能一致(勾选左侧三维/二维/三维分析栏数据集渲染),标签换行 - 切换项目(topBar projectSwitchRequested / ProjectListDialog projectChosen,带 id≠当前 守卫避开 delete-refresh)先 clearCentral:清三栏(col3D/col2D/colAnalysis setDatasets({})) + 清勾选集(checkedProfiles/Analysis/Slice)下发空到 VTK(pushChecked/syncSlices/ setChecked2DDatasets({})) + 恢复空态浮层 build all 绿,341/341。 --- src/app/main.cpp | 54 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 9d7c8c2..bb67387 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -192,9 +192,15 @@ public: { overlay_->adjustSize(); const QSize h = host_->size(); - const QSize o = overlay_->size(); - overlay_->move(host_->x() + (h.width() - o.width()) / 2, - host_->y() + (h.height() - o.height()) / 2); + // 浮层尺寸钳到不超过 host:host 比内容小(窗口/抽屉收窄)时不再溢出视图。 + QSize o = overlay_->size(); + o.setWidth(std::min(o.width(), h.width())); + o.setHeight(std::min(o.height(), h.height())); + overlay_->resize(o); + // 偏移取非负:保证浮层矩形始终 ⊆ host 矩形(不跑到 host 外)。 + const int dx = std::max(0, (h.width() - o.width()) / 2); + const int dy = std::max(0, (h.height() - o.height()) / 2); + overlay_->move(host_->x() + dx, host_->y() + dy); overlay_->raise(); } @@ -919,17 +925,19 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re .pixmap(56, 56)); esIcon->setAlignment(Qt::AlignCenter); - auto* esTitle = new QLabel(QStringLiteral("选择左侧数据集开始分析"), emptyState); + auto* esTitle = new QLabel(QStringLiteral("勾选左侧数据集开始渲染"), emptyState); esTitle->setAlignment(Qt::AlignCenter); + esTitle->setWordWrap(true); // 窄时换行,不撑宽浮层 geopro::app::applyTokenizedStyleSheet( esTitle, QStringLiteral("color:{{canvas/text}}; font-size:%1px; font-weight:%2;") .arg(geopro::app::scaledPx(geopro::app::type::kHeading)) .arg(geopro::app::type::kWeightSemibold)); - auto* esHint = new QLabel(QStringLiteral("单击左侧采集批次,查看反演剖面与异常点\n" - "切到「三维视图」可叠加帘面、体素与地形图层"), + auto* esHint = new QLabel(QStringLiteral("在左侧「三维数据集 / 二维数据集 / 三维分析」栏勾选数据集,\n" + "在此叠加显示;可切换二维 / 三维视图。"), emptyState); esHint->setAlignment(Qt::AlignCenter); + esHint->setWordWrap(true); // 窄时换行,不撑宽浮层 geopro::app::applyTokenizedStyleSheet( esHint, QStringLiteral("color:{{canvas/text-dim}}; font-size:%1px;").arg(geopro::app::scaledPx(geopro::app::type::kBody))); @@ -1197,8 +1205,33 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re }; QObject::connect(topBar, &geopro::app::TopBar::workspaceSwitchRequested, &nav, &geopro::controller::WorkbenchNavController::switchWorkspace); + + // 切换到「不同项目」时先清空中央区,避免新项目残留旧项目的三栏数据与 VTK 渲染。 + // 仅真正换项目用(delete-refresh 等 switchProject(currentProjectId) 不走此处,避免误清)。 + auto clearCentral = [drawer, sceneCtrl, emptyState, checkedProfiles, checkedAnalysis, + pushChecked, lastAnalysisRows, refreshAnalysis, checkedSliceIds, + syncSlices]() { + // 三栏清空(col2D/col3D setDatasets({}) 会顺带发空勾选 → setChecked2DDatasets({})/帘面清空)。 + drawer->col3D()->setDatasets({}); + drawer->col2D()->setDatasets({}); + *lastAnalysisRows = {}; + refreshAnalysis(); // 后端分析行清空(客户端三维体仍按设计驻留三维分析栏) + // 勾选集清空并下发空到 VTK(帘面/体素/切片/2D 足迹全部撤场)。 + checkedProfiles->clear(); + checkedAnalysis->clear(); + checkedSliceIds->clear(); + pushChecked(); // setCheckedDatasets({}) → 帘面/体素清空 + syncSlices(); // 切片随空勾选调和 + sceneCtrl->setChecked2DDatasets({}); // 2D 足迹显式撤场(与 col2D 空勾选双保险) + // 空状态浮层恢复(对象树勾选会随 structureLoaded 重建而清,无需手动)。 + emptyState->setVisible(true); + }; + QObject::connect(topBar, &geopro::app::TopBar::projectSwitchRequested, &nav, - &geopro::controller::WorkbenchNavController::switchProject); + [&nav, clearCentral](const QString& id) { + if (id != nav.currentProjectId()) clearCentral(); // 真正换项目才清 + nav.switchProject(id); + }); // 退出登录:清除记住的凭证(QtKeychain+QSettings) → 重启应用回到登录页。 QObject::connect(topBar, &geopro::app::TopBar::logoutRequested, &window, []() { geopro::app::forgetSession(); @@ -1212,12 +1245,15 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re dlg.exec(); }); QObject::connect(topBar, &geopro::app::TopBar::allProjectsRequested, &window, - [&projectRepo, &nav, topBar, &window]() { + [&projectRepo, &nav, topBar, &window, clearCentral]() { auto* dlg = new geopro::app::ProjectListDialog(projectRepo, &window); dlg->setAttribute(Qt::WA_DeleteOnClose); QObject::connect(dlg, &geopro::app::ProjectListDialog::projectChosen, &nav, - [&nav, topBar](const QString& id, const QString& name) { + [&nav, topBar, clearCentral](const QString& id, + const QString& name) { topBar->setProjectButtonText(name); + if (id != nav.currentProjectId()) + clearCentral(); // 真正换项目才清 nav.switchProject(id); }); dlg->exec();