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