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();