#pragma once #include #include #include #include "nmSubWnd_global.h" class iRibbonXmlCmd; class iRibbonXmlTab; class ZxMainWindow; class iSubWnd; class iDockBaseWx; class ZxTabWidget; class QMdiSubWindow; class ZxMdiSubWindow; class QEvent; class iSubWndFitting; // 本来主要是为数值部分提供SubWnd初始化构造的方法 class NM_SUB_WND_EXPORT nmSubWndUtils : public QObject { Q_OBJECT public: static nmSubWndUtils* getInstance(); nmSubWndUtils(); ~nmSubWndUtils(); public: /// @brief 构造窗体,根据RibbonXmlCmd /// @param pCmdInfo(const in) 命令Cmb定义 /// @param pMainWnd(const in) 主窗体 /// @param bCreatedNewOne(out) 返回是否新建的,还是 原先的 /// @note 权宜之计:此处构造的窗体,无需额外删除(析构),系统会统一处理 static iSubWnd* createSubWnd(const iRibbonXmlCmd* pCmdInfo, \ const ZxMainWindow* pMainWnd, \ bool& bCreatedNewOne); /// @brief 构造窗体,根据sID和sExt /// @param sID,sExt 命令Cmb定义,来自RibbonXmlCmd /// @param pMainWnd(const in) 主窗体 /// @param bCreatedNewOne 返回是否新建的,还是 原先的 /// @param bCreatedNewOne(out) 返回是否新建的,还是 原先的 /// @param bOnlyOneForCurTabWx(in) 为true,则如果已有则直接返回,false,每次都会自动创建新的 /// @note 权宜之计:此处构造的窗体,无需额外删除(析构),系统会统一处理 static iSubWnd* makesureSubWnd(QString sID, QString sExt, \ const ZxMainWindow* pMainWnd, \ bool& bCreatedNewOne, \ bool bOnlyOneForCurTabWx = true); /// @brief 执行一些特殊的功能按钮 /// @param pCmdInfo (const in)命令Cmb定义 /// @param pMainWnd (const in)主窗体 /// @return 只要是数值模块自己的按钮,请返回true,否则,返回false /// @note 此处指的是:与SubWnd无关,即不受SubWnd限制的功能按钮 static bool runCmdBySpecial(const iRibbonXmlCmd* pCmdInfo, \ const ZxMainWindow* pMainWnd); /// @brief 执行一些特殊的功能按钮 /// @param sID,sExt(in) 命令Cmb定义,来自RibbonXmlCmd /// @param pMainWnd(const in) 主窗体 /// @return 只要是数值模块自己的按钮,请返回true,否则,返回false /// @note 此处指的是:与SubWnd无关,即不受SubWnd限制的功能按钮 /// sID和sExt也是来自于RibbonXmlCmd static bool runCmdBySpecial(QString sID, QString sExt, \ const ZxMainWindow* pMainWnd); /// @brief 在当前没有激活数值SubWnd的情况下,判断是否某些命令是否Enable /// @param sID(in) 命令ID /// @param sName(in) 命令Name /// @param bLicensed(const in)当前是否正式授权 /// @param pMainWnd(const in) 主窗体 /// @note sID和sName也是来自于RibbonXmlCmd static bool isEnableOfID_Common(QString sID, QString sName, \ const bool bLicensed, \ const ZxMainWindow* pMainWnd); /// @brief 当Ribbon上顶级Tab选项切换时,触发/允许外部[比如数值试井]做些相应处理 /// @param pTab(in) 当前激活的是哪个Tab,请iRibbonXmlTab进行筛选是不是自己需要的Tab /// @param pMainWnd(const in) 主窗体 static bool dealwithRibbonTab(iRibbonXmlTab* pTab, \ const ZxMainWindow* pMainWnd); /// @brief 当首次切换为数值解时,进行Dock(目前设定两个)的内容设定 /// @param pSubWnd(in) 当前的SubWndFitting窗体 static bool fillNmDockWxs(iSubWnd* pSubWnd); /// @brief 解析解计算及结果刷新部分 /// @param pSubWnd(in) 当前的SubWndFitting窗体 /// @param pMainWnd(const in) 主窗体 static bool nmCalAndFresh(iSubWnd* pSubWnd, \ const ZxMainWindow* pMainWnd); /// @brief 获取解析解的当前参数相关信息,请根据需要调整该函数 /// @param pSubWnd(in) 当前的SubWndFitting窗体 static bool getAnaDockParas(iSubWnd* pSubWnd); /// @brief 在成果保存时,辅助信息(如数值解相关)保存 /// @param pSubWnd(in) 基本上指的是 SubWndFitting 窗体 /// @param sRstName(in) 指的是成果的名称 /// @param pMainWnd(const in) 主窗体 static bool saveRsts(iSubWnd* pSubWnd, \ QString sRstName, \ const ZxMainWindow* pMainWnd); /// @brief 在成果加载时,辅助信息(如数值解相关)加载 /// @param pSubWnd(in) 基本上指的是 SubWndFitting 窗体 /// @param sRstName(in) 指的是成果的名称 /// @param pMainWnd(const in) 主窗体 static bool loadRsts(iSubWnd* pSubWnd, \ QString sRstName, \ const ZxMainWindow* pMainWnd); public slots: // 声明处理 ZxTabWidget 切换的槽函数 // 信号 currentChanged(int) 传递一个 int 参数 void slotHandleTabChange(int index); // 外层MDI成果窗口切换后,同步当前流动段分析窗口和左侧数值解面板 void slotHandleMdiSubWindowActivated(QMdiSubWindow* pSubWindow); // 关闭成果或流动段分析后,释放对应的数据管理器 void slotHandleFittingDestroyed(QObject* pObject); // 外层成果取消关闭时,恢复正常的页签清理逻辑 void slotHandleMdiClosing(bool& bAllowClose); // 外层成果窗口析构后,移除保存的关闭状态 void slotHandleMdiDestroyed(QObject* pObject); protected: // 在窗口仍完整时处理关闭事件,避免析构阶段访问已释放的画布对象 virtual bool eventFilter(QObject* pObject, QEvent* pEvent) override; private: // 监听外层MDI成果窗口切换,区别于成果窗口内部的页签切换 void connectMdiActivation(iSubWndFitting* pSubWndF); // 单独关闭流动段分析页签时,移除仍引用其数据的画布图元 void detachFittingPlot(iSubWndFitting* pSubWndF); // 关闭外层成果窗口时,提前解除其Map图元对分析数据的引用 void detachMdiFittingPlots(ZxMdiSubWindow* pMdiChild); // 因为边界是可以旋转的,所以真实的顺序并非ee,se,we,ne,根据索引传递,查阅真实的,比如 ee,se,we,ne // xIndex 从1开始,如果矩形,则分别传入,1,2,3,4 如果是圆形,则传入1 static QString getBdyRealNameOf(int xIndex, QMap& map); // 存储当前操作的是哪一个窗体 ZxMainWindow* m_pMainWnd; ZxTabWidget* m_pTabWx; // destroyed信号异步处理时,通过QObject地址取回析构前保存的分析窗口key QMap m_mapFittingKeys; // 外层成果窗口关闭时,其画布已在MDI Close阶段清理,后续子窗口Close不再重复处理 QSet m_closingMdiChildren; };