修复一个成果中有多个流动段分析窗口时,关闭会崩溃的问题

feature/UI-20260528
lvjunjie 6 days ago
parent 840c2914d9
commit fc3f7328aa

@ -2419,10 +2419,16 @@ void nmSubWndMain::displaySetting()
void nmSubWndMain::updateMapByDataManager(nmDataAnalyzeManager* pDataManager) void nmSubWndMain::updateMapByDataManager(nmDataAnalyzeManager* pDataManager)
{ {
// 删除原来的图元信息 // 删除原来的图元信息
if(m_pWxPlot == nullptr) { if(m_pWxPlot == nullptr || pDataManager == nullptr) {
return; return;
} }
foreach(nmDataAnalyzeManager* pManager, nmDataAnalyzeManager::s_mapDataAnalManager.values()) {
if(pManager != nullptr && pManager != pDataManager && pManager->getPlot() == m_pWxPlot) {
pManager->setPlot(nullptr);
}
}
// 更新对应的Plot成员变量 // 更新对应的Plot成员变量
pDataManager->setPlot(m_pWxPlot); pDataManager->setPlot(m_pWxPlot);

@ -40,16 +40,17 @@ void nmSubWndSubWxsAnalyzeController::updateWindowsForCurrentAnalyze(ZxMainWindo
ZxTabWidget* pTabWx = pMainWindow->getCurTabWx(); ZxTabWidget* pTabWx = pMainWindow->getCurTabWx();
QVector<iSubWnd*> vecSubWnds = pMainWindow->getAllSubWndsOf(pTabWx); QVector<iSubWnd*> vecSubWnds = pMainWindow->getAllSubWndsOf(pTabWx);
nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF);
foreach (iSubWnd* pSub, vecSubWnds) { foreach (iSubWnd* pSub, vecSubWnds) {
nmSubWndMain* pMap = dynamic_cast<nmSubWndMain*>(pSub); nmSubWndMain* pMap = dynamic_cast<nmSubWndMain*>(pSub);
if(nullptr != pMap) { if(nullptr != pMap) {
pMap->updateMapByDataManager(nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF)); pMap->updateMapByDataManager(pManager);
} }
nmSubWndGrid* pSubWndGrid = dynamic_cast<nmSubWndGrid*>(pSub); nmSubWndGrid* pSubWndGrid = dynamic_cast<nmSubWndGrid*>(pSub);
if(nullptr != pSubWndGrid) { if(nullptr != pSubWndGrid) {
QObject::disconnect(nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF), SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid())); QObject::disconnect(pManager, SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid()));
QObject::connect(nmDataAnalyzeManager::getInstanceByFitting(pCurSubWndF), SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid()), Qt::QueuedConnection); QObject::connect(pManager, SIGNAL(dataChanged()), pSubWndGrid, SLOT(updateGrid()), Qt::QueuedConnection);
pSubWndGrid->updateGrid(); pSubWndGrid->updateGrid();
} }
} }

@ -1167,12 +1167,25 @@ bool nmSubWndUtils::eventFilter(QObject* pObject, QEvent* pEvent)
void nmSubWndUtils::detachFittingPlot(iSubWndFitting* pSubWndF) void nmSubWndUtils::detachFittingPlot(iSubWndFitting* pSubWndF)
{ {
nmDataAnalyzeManager* pDataManager = nmDataAnalyzeManager::findManagerByFitting(pSubWndF); nmDataAnalyzeManager* pDataManager = nmDataAnalyzeManager::findManagerByFitting(pSubWndF);
// 当前画布可能已经切换到其他分析,只清理由被关闭分析正在展示的图元。 if(pDataManager == nullptr) {
if(pDataManager != nullptr && nmDataAnalyzeManager::getCurrentFitting() == pSubWndF) { return;
nmGuiPlot* pPlot = pDataManager->getPlot(); }
if(pPlot != nullptr) {
// 画布图元引用DataManager中的数据释放数据前先移除仍在显示的图元。 nmGuiPlot* pPlot = pDataManager->getPlot();
pPlot->deleteAllPlotObjs(); 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);
} }
} }
} }

Loading…
Cancel
Save