From 832665fc655c6375cd721f04d7c59b0b199ca605 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Tue, 2 Jun 2026 10:29:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=87=E6=8D=A2=E6=88=90?= =?UTF-8?q?=E6=9E=9C=E5=90=8E=EF=BC=8C=E6=B5=81=E5=8A=A8=E6=AE=B5=E6=8C=87?= =?UTF-8?q?=E9=92=88=E4=B8=8D=E5=90=8C=E6=AD=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/nmNum/nmSubWnd/nmSubWndUtils.h | 7 ++ Include/nmNum/nmSubWxs/nmWxNumericalDesign.h | 2 + Src/nmNum/nmSubWnd/nmSubWndUtils.cpp | 82 +++++++++++++++++++- Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp | 10 +++ 4 files changed, 99 insertions(+), 2 deletions(-) diff --git a/Include/nmNum/nmSubWnd/nmSubWndUtils.h b/Include/nmNum/nmSubWnd/nmSubWndUtils.h index 1b0a6a7..ca9a964 100644 --- a/Include/nmNum/nmSubWnd/nmSubWndUtils.h +++ b/Include/nmNum/nmSubWnd/nmSubWndUtils.h @@ -10,6 +10,8 @@ class ZxMainWindow; class iSubWnd; class iDockBaseWx; class ZxTabWidget; +class QMdiSubWindow; +class iSubWndFitting; // 本来主要是为数值部分提供SubWnd初始化构造的方法 class NM_SUB_WND_EXPORT nmSubWndUtils : public QObject @@ -112,9 +114,14 @@ public: // 声明处理 ZxTabWidget 切换的槽函数 // 信号 currentChanged(int) 传递一个 int 参数 void slotHandleTabChange(int index); + // 外层MDI成果窗口切换后,同步当前流动段分析窗口和左侧数值解面板 + void slotHandleMdiSubWindowActivated(QMdiSubWindow* pSubWindow); private: + // 监听外层MDI成果窗口切换,区别于成果窗口内部的页签切换 + void connectMdiActivation(iSubWndFitting* pSubWndF); + // 因为边界是可以旋转的,所以真实的顺序并非ee,se,we,ne,根据索引传递,查阅真实的,比如 ee,se,we,ne // xIndex 从1开始,如果矩形,则分别传入,1,2,3,4 如果是圆形,则传入1 static QString getBdyRealNameOf(int xIndex, QMap& map); diff --git a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h index b71e326..b63e67a 100644 --- a/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h +++ b/Include/nmNum/nmSubWxs/nmWxNumericalDesign.h @@ -35,6 +35,8 @@ public: static void notifyTimeDependentSkinChanged(const QString& wellName, bool checked); // 刷新查看井结果下拉框 static void notifyResultWellSelectorChanged(const QString& wellName = QString()); + // 将当前成果面板设为活动实例,并按照当前数据中心刷新查看井结果下拉框 + void activateCurrentInstance(); signals: void sigGenerateClicked(); // 点击生成按钮时发出的信号 diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index af69b6e..fd4932b 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -1,10 +1,13 @@ #include "zxLogInstance.h" #include "iRibbonXmlCmd.h" #include +#include +#include #include "zxSysUtils.h" #include "ZxUiBase.h" #include "ZxMainWindow.h" +#include "ZxMdiSubWindow.h" #include "ZxTabWidget.h" #include "TreeWxMain.h" #include "iDockBaseWx.h" @@ -416,6 +419,10 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd) return false; } + // 每个成果窗口只需要绑定一次外层MDI激活信号。 + // 后续切换成果窗口时,通过激活事件同步对应的数据中心和左侧面板。 + nmSubWndUtils::getInstance()->connectMdiActivation(pSubWndF); + // 设置当前分析窗体 nmDataAnalyzeManager::setCurrentFitting(pSubWndF); @@ -802,6 +809,9 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ return false; } + // 监听外层成果窗口切换,保证重新激活已经打开过的成果时可以同步数据中心。 + pUtilsInstance->connectMdiActivation(pSubWndF); + // 设置当前操作的是哪一个分析 nmDataAnalyzeManager::setCurrentFitting(pSubWndF); @@ -809,8 +819,6 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \ pDataManager->loadNmResult(sDir); // 加载当前分析中的PVT数据 pDataManager->initPvtParaFromSubFit(); - // 成果加载完成后刷新查看井下拉框 - nmWxNumericalDesign::notifyResultWellSelectorChanged(); // 切换左侧参数视图 pSubWndF->swapAnaNmDocks(true); @@ -1092,3 +1100,73 @@ void nmSubWndUtils::slotHandleTabChange(int index) } } } + +// 监听外层MDI成果窗口切换 +void nmSubWndUtils::connectMdiActivation(iSubWndFitting* pSubWndF) +{ + if(pSubWndF == nullptr) { + return; + } + + ZxMdiSubWindow* pMdiChild = pSubWndF->getMdiChild(); + ZxMainWindow* pMainWnd = pSubWndF->getMainWindow(); + if(pMdiChild == nullptr || pMainWnd == nullptr || pMdiChild->mdiArea() == nullptr) { + return; + } + + m_pMainWnd = pMainWnd; + // 一个QMdiArea中可以同时存在多个成果窗口。 + // 使用UniqueConnection避免每次打开成果时重复绑定同一个激活信号。 + connect(pMdiChild->mdiArea(), SIGNAL(subWindowActivated(QMdiSubWindow*)), + this, SLOT(slotHandleMdiSubWindowActivated(QMdiSubWindow*)), + Qt::UniqueConnection); +} + +// 切换外层MDI成果窗口后,同步当前流动段分析窗口 +void nmSubWndUtils::slotHandleMdiSubWindowActivated(QMdiSubWindow* pSubWindow) +{ + ZxMdiSubWindow* pMdiChild = qobject_cast(pSubWindow); + if(pMdiChild == nullptr || m_pMainWnd == nullptr) { + return; + } + + ZxTabWidget* pTabWx = m_pMainWnd->getTabWxOf(pMdiChild); + if(pTabWx == nullptr) { + return; + } + + // 每个成果窗口内部都有自己的页签容器。 + // 切换外层成果后,保存当前容器并继续监听该成果内部的页签切换。 + m_pTabWx = pTabWx; + connect(m_pTabWx, SIGNAL(currentChanged(int)), + this, SLOT(slotHandleTabChange(int)), + Qt::UniqueConnection); + + // 找到当前成果中的流动段分析窗口。 + // 窗口ID为3004,后续的数据中心和左侧面板都属于这个分析窗口。 + QVector vecSubWnds = m_pMainWnd->getAllSubWndsOf(m_pTabWx, "3004", true); + if(vecSubWnds.isEmpty()) { + return; + } + + iSubWndFitting* pSubWndF = dynamic_cast(vecSubWnds.first()); + if(pSubWndF == nullptr || nmDataAnalyzeManager::findManagerByFitting(pSubWndF) == nullptr) { + return; + } + + // 先切换数据中心,再刷新左侧面板。 + // 下拉框填充函数会读取getCurrentInstance(),顺序不能颠倒。 + nmDataAnalyzeManager::setCurrentFitting(pSubWndF); + + iDockBaseWx* pWxDockNm1 = pSubWndF->getNmDockWx(0); + if(pWxDockNm1 == nullptr) { + return; + } + + nmWxNumericalDesign* pAnalWx = dynamic_cast(pWxDockNm1->widget()); + if(pAnalWx != nullptr) { + // 已经打开过的成果会复用旧面板,不会再次进入构造函数。 + // 主动更新活动面板指针,保证静态通知刷新的是当前成果中的下拉框。 + pAnalWx->activateCurrentInstance(); + } +} diff --git a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp index 8f39244..d82ecf3 100644 --- a/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp +++ b/Src/nmNum/nmSubWxs/nmWxNumericalDesign.cpp @@ -124,6 +124,16 @@ nmWxNumericalDesign::~nmWxNumericalDesign() } } +// 激活当前成果面板,并刷新查看井结果下拉框 +void nmWxNumericalDesign::activateCurrentInstance() +{ + // 一个QMdiArea中可以同时打开多个成果窗口,每个成果都有自己的数值解面板。 + // 已经打开过的成果再次被激活时不会重新构造面板,因此需要在切换时更新静态指针。 + s_pCurrentInstance = this; + // 调用前已经切换到当前成果的数据中心,此处按照当前成果重新填充下拉框。 + fillResultWellCombo(); +} + // 外部刷新当前查看井下拉框 void nmWxNumericalDesign::notifyResultWellSelectorChanged(const QString& wellName) {