|
|
|
@ -1,6 +1,7 @@
|
|
|
|
#include "zxLogInstance.h"
|
|
|
|
#include "zxLogInstance.h"
|
|
|
|
#include "iRibbonXmlCmd.h"
|
|
|
|
#include "iRibbonXmlCmd.h"
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
#include <QEvent>
|
|
|
|
#include <QMdiArea>
|
|
|
|
#include <QMdiArea>
|
|
|
|
#include <QMdiSubWindow>
|
|
|
|
#include <QMdiSubWindow>
|
|
|
|
#include "zxSysUtils.h"
|
|
|
|
#include "zxSysUtils.h"
|
|
|
|
@ -1108,8 +1109,27 @@ void nmSubWndUtils::connectMdiActivation(iSubWndFitting* pSubWndF)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 关闭成果窗口或流动段分析页签时,都会销毁对应的iSubWndFitting。
|
|
|
|
|
|
|
|
// 在Close事件中先解除图元引用,队列槽再等子对象完成析构后释放数据管理器。
|
|
|
|
|
|
|
|
m_mapFittingKeys.insert(pSubWndF, pSubWndF);
|
|
|
|
|
|
|
|
pSubWndF->installEventFilter(this);
|
|
|
|
|
|
|
|
connect(pSubWndF, SIGNAL(destroyed(QObject*)),
|
|
|
|
|
|
|
|
this, SLOT(slotHandleFittingDestroyed(QObject*)),
|
|
|
|
|
|
|
|
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));
|
|
|
|
|
|
|
|
|
|
|
|
ZxMdiSubWindow* pMdiChild = pSubWndF->getMdiChild();
|
|
|
|
ZxMdiSubWindow* pMdiChild = pSubWndF->getMdiChild();
|
|
|
|
ZxMainWindow* pMainWnd = pSubWndF->getMainWindow();
|
|
|
|
ZxMainWindow* pMainWnd = pSubWndF->getMainWindow();
|
|
|
|
|
|
|
|
if(pMdiChild != nullptr) {
|
|
|
|
|
|
|
|
// 外层成果关闭时先记录状态,避免子窗口析构期间主动遍历半析构画布。
|
|
|
|
|
|
|
|
pMdiChild->installEventFilter(this);
|
|
|
|
|
|
|
|
connect(pMdiChild, SIGNAL(sigConformClosing(bool&)),
|
|
|
|
|
|
|
|
this, SLOT(slotHandleMdiClosing(bool&)),
|
|
|
|
|
|
|
|
Qt::UniqueConnection);
|
|
|
|
|
|
|
|
connect(pMdiChild, SIGNAL(destroyed(QObject*)),
|
|
|
|
|
|
|
|
this, SLOT(slotHandleMdiDestroyed(QObject*)),
|
|
|
|
|
|
|
|
Qt::UniqueConnection);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(pMdiChild == nullptr || pMainWnd == nullptr || pMdiChild->mdiArea() == nullptr) {
|
|
|
|
if(pMdiChild == nullptr || pMainWnd == nullptr || pMdiChild->mdiArea() == nullptr) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1122,6 +1142,63 @@ void nmSubWndUtils::connectMdiActivation(iSubWndFitting* pSubWndF)
|
|
|
|
Qt::UniqueConnection);
|
|
|
|
Qt::UniqueConnection);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 在窗口仍完整时处理关闭事件
|
|
|
|
|
|
|
|
bool nmSubWndUtils::eventFilter(QObject* pObject, QEvent* pEvent)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if(pEvent == nullptr || pEvent->type() != QEvent::Close) {
|
|
|
|
|
|
|
|
return QObject::eventFilter(pObject, pEvent);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZxMdiSubWindow* pMdiChild = qobject_cast<ZxMdiSubWindow*>(pObject);
|
|
|
|
|
|
|
|
if(pMdiChild != nullptr) {
|
|
|
|
|
|
|
|
m_closingMdiChildren.insert(pMdiChild);
|
|
|
|
|
|
|
|
return QObject::eventFilter(pObject, pEvent);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
iSubWndFitting* pSubWndF = m_mapFittingKeys.value(pObject, nullptr);
|
|
|
|
|
|
|
|
if(pSubWndF != nullptr && !m_closingMdiChildren.contains(pSubWndF->getMdiChild())) {
|
|
|
|
|
|
|
|
detachFittingPlot(pSubWndF);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return QObject::eventFilter(pObject, 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();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 流动段分析窗口销毁后,释放对应的数据管理器
|
|
|
|
|
|
|
|
void nmSubWndUtils::slotHandleFittingDestroyed(QObject* pObject)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// 队列槽执行时窗口对象已经销毁,只使用析构前保存的地址作为静态映射key。
|
|
|
|
|
|
|
|
iSubWndFitting* pSubWndF = m_mapFittingKeys.take(pObject);
|
|
|
|
|
|
|
|
nmDataAnalyzeManager::removeInstanceByFitting(pSubWndF);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 外层成果取消关闭时,移除Close事件过滤器提前保存的状态
|
|
|
|
|
|
|
|
void nmSubWndUtils::slotHandleMdiClosing(bool& bAllowClose)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!bAllowClose) {
|
|
|
|
|
|
|
|
m_closingMdiChildren.remove(sender());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 外层成果窗口析构后,移除仅用于生命周期判断的地址
|
|
|
|
|
|
|
|
void nmSubWndUtils::slotHandleMdiDestroyed(QObject* pObject)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
m_closingMdiChildren.remove(pObject);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 切换外层MDI成果窗口后,同步当前流动段分析窗口
|
|
|
|
// 切换外层MDI成果窗口后,同步当前流动段分析窗口
|
|
|
|
void nmSubWndUtils::slotHandleMdiSubWindowActivated(QMdiSubWindow* pSubWindow)
|
|
|
|
void nmSubWndUtils::slotHandleMdiSubWindowActivated(QMdiSubWindow* pSubWindow)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|