From 8b3bc50f5802c9d0caed424ac819607c9fc81bb3 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 11 Jun 2026 21:06:35 +0800 Subject: [PATCH] =?UTF-8?q?harden(app):=20setData=20=E9=87=8D=E7=BD=AE?= =?UTF-8?q?=E9=81=AE=E7=BD=A9=20+=20loadFailed=20context=3DdetailPanel(?= =?UTF-8?q?=E9=98=B2=E9=87=8E=E6=8C=87=E9=92=88)=20+=20LoadingOverlay=20Q?= =?UTF-8?q?=5FASSERT(parent)=20+=20=E5=88=A0=E6=9C=AA=E7=94=A8=20include?= =?UTF-8?q?=EF=BC=88=E8=AF=84=E5=AE=A1=20I-1/I-2/M-3/4/5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/main.cpp | 5 ++++- src/app/panels/DatasetDetailPage.cpp | 1 + src/app/panels/LoadingOverlay.cpp | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index e193ece..139c7b4 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -527,7 +527,10 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re if (phase == geopro::controller::DatasetDetailController::LoadPhase::Grid) detailPanel->setGridLoading(dsId, true); }); - QObject::connect(&detailCtrl, &geopro::controller::DatasetDetailController::loadFailed, &window, + // context 用 detailPanel(与 loadStarted 一致):detailPanel 析构即自动断连,避免野指针。 + // window 比 detailPanel 活得久,lambda 捕 &window 取状态栏安全。loadFailed 无 phase: + // Chart 失败时 gridOverlay 本已隐藏,setGridLoading(false) 幂等无害;Grid 失败时正确清遮罩。 + QObject::connect(&detailCtrl, &geopro::controller::DatasetDetailController::loadFailed, detailPanel, [&window, detailPanel](const QString& dsId, const QString& msg) { detailPanel->setGridLoading(dsId, false); window.statusBar()->showMessage( diff --git a/src/app/panels/DatasetDetailPage.cpp b/src/app/panels/DatasetDetailPage.cpp index 061cbb6..7b5f47f 100644 --- a/src/app/panels/DatasetDetailPage.cpp +++ b/src/app/panels/DatasetDetailPage.cpp @@ -51,6 +51,7 @@ void DatasetDetailPage::setData(const geopro::controller::DatasetDetailControlle gridRequested_ = false; // 新数据集 → 网格数据需重新按需加载 rawView_->setData(d); gridView_->setData(d); + setGridLoading(false); // 重开/换 ds:重置遮罩状态,避免上次的「加载中」残留 } void DatasetDetailPage::setGridData( diff --git a/src/app/panels/LoadingOverlay.cpp b/src/app/panels/LoadingOverlay.cpp index 3b7e446..00bc80f 100644 --- a/src/app/panels/LoadingOverlay.cpp +++ b/src/app/panels/LoadingOverlay.cpp @@ -1,12 +1,12 @@ #include "panels/LoadingOverlay.hpp" #include #include -#include #include namespace geopro::app { LoadingOverlay::LoadingOverlay(QWidget* parent) : QWidget(parent), label_(new QLabel(this)) { + Q_ASSERT(parent); // 契约:必须有父(遮罩几何跟随父,无父无法工作) setAttribute(Qt::WA_StyledBackground, true); setStyleSheet(QStringLiteral("background: rgba(255,255,255,160);")); label_->setText(QStringLiteral("加载中…"));