From fc3f7328aa53d4fa8fde92597ddc6cc2cef05238 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Mon, 8 Jun 2026 10:17:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA=E6=88=90?= =?UTF-8?q?=E6=9E=9C=E4=B8=AD=E6=9C=89=E5=A4=9A=E4=B8=AA=E6=B5=81=E5=8A=A8?= =?UTF-8?q?=E6=AE=B5=E5=88=86=E6=9E=90=E7=AA=97=E5=8F=A3=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E4=BC=9A=E5=B4=A9=E6=BA=83=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/nmNum/nmSubWnd/nmSubWndMain.cpp | 8 +++++- .../nmSubWndSubWxsAnalyzeController.cpp | 7 +++--- Src/nmNum/nmSubWnd/nmSubWndUtils.cpp | 25 ++++++++++++++----- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index ac6332a..98c75e3 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -2419,10 +2419,16 @@ void nmSubWndMain::displaySetting() void nmSubWndMain::updateMapByDataManager(nmDataAnalyzeManager* pDataManager) { // 删除原来的图元信息 - if(m_pWxPlot == nullptr) { + if(m_pWxPlot == nullptr || pDataManager == nullptr) { return; } + foreach(nmDataAnalyzeManager* pManager, nmDataAnalyzeManager::s_mapDataAnalManager.values()) { + if(pManager != nullptr && pManager != pDataManager && pManager->getPlot() == m_pWxPlot) { + pManager->setPlot(nullptr); + } + } + // 更新对应的Plot成员变量 pDataManager->setPlot(m_pWxPlot); diff --git a/Src/nmNum/nmSubWnd/nmSubWndSubWxsAnalyzeController.cpp b/Src/nmNum/nmSubWnd/nmSubWndSubWxsAnalyzeController.cpp index 398598d..2706a04 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndSubWxsAnalyzeController.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndSubWxsAnalyzeController.cpp @@ -40,16 +40,17 @@ void nmSubWndSubWxsAnalyzeController::updateWindowsForCurrentAnalyze(ZxMainWindo ZxTabWidget* pTabWx = pMainWindow->getCurTabWx(); QVector vecSubWnds = pMainWindow->getAllSubWndsOf(pTabWx); + nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF); foreach (iSubWnd* pSub, vecSubWnds) { nmSubWndMain* pMap = dynamic_cast(pSub); if(nullptr != pMap) { - pMap->updateMapByDataManager(nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF)); + pMap->updateMapByDataManager(pManager); } nmSubWndGrid* pSubWndGrid = dynamic_cast(pSub); if(nullptr != pSubWndGrid) { - QObject::disconnect(nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF), SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid())); - QObject::connect(nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF), SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid()), Qt::QueuedConnection); + QObject::disconnect(pManager, SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid())); + QObject::connect(pManager, SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid()), Qt::QueuedConnection); pSubWndGrid->updateGrid(); } } diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index 10a544c..8516ed6 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -1167,12 +1167,25 @@ bool nmSubWndUtils::eventFilter(QObject* pObject, QEvent* pEvent) void nmSubWndUtils::detachFittingPlot(iSubWndFitting* pSubWndF) { nmDataAnalyzeManager* pDataManager = nmDataAnalyzeManager::findManagerByFitting(pSubWndF); - // 当前画布可能已经切换到其他分析,只清理由被关闭分析正在展示的图元。 - if(pDataManager != nullptr && nmDataAnalyzeManager::getCurrentFitting() == pSubWndF) { - nmGuiPlot* pPlot = pDataManager->getPlot(); - if(pPlot != nullptr) { - // 画布图元引用DataManager中的数据,释放数据前先移除仍在显示的图元。 - pPlot->deleteAllPlotObjs(); + if(pDataManager == nullptr) { + return; + } + + nmGuiPlot* pPlot = pDataManager->getPlot(); + if(pPlot == nullptr) { + return; + } + + // 关闭页签时可能会先触发页签切换,导致Map短暂刷新到待关闭分析。 + // 以DataManager是否仍绑定Plot判断Map是否实际展示该分析,避免只看currentFitting误判。 + pPlot->deleteAllPlotObjs(); + pDataManager->setPlot(nullptr); + + if(nmDataAnalyzeManager::getCurrentFitting() != pSubWndF) { + nmDataAnalyzeManager* pCurManager = nmDataAnalyzeManager::getCurrentInstance(); + if(pCurManager != nullptr) { + pCurManager->setPlot(pPlot); + pPlot->setPlotsByDataManger(pCurManager); } } }