修改切换成果后,流动段指针不同步的问题

feature/UI-20260528
lvjunjie 2 weeks ago
parent b92403c904
commit 832665fc65

@ -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<QString, QVariant>& map);

@ -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(); // 点击生成按钮时发出的信号

@ -1,10 +1,13 @@
#include "zxLogInstance.h"
#include "iRibbonXmlCmd.h"
#include <QDebug>
#include <QMdiArea>
#include <QMdiSubWindow>
#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<ZxMdiSubWindow*>(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<iSubWnd*> vecSubWnds = m_pMainWnd->getAllSubWndsOf(m_pTabWx, "3004", true);
if(vecSubWnds.isEmpty()) {
return;
}
iSubWndFitting* pSubWndF = dynamic_cast<iSubWndFitting*>(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<nmWxNumericalDesign*>(pWxDockNm1->widget());
if(pAnalWx != nullptr) {
// 已经打开过的成果会复用旧面板,不会再次进入构造函数。
// 主动更新活动面板指针,保证静态通知刷新的是当前成果中的下拉框。
pAnalWx->activateCurrentInstance();
}
}

@ -124,6 +124,16 @@ nmWxNumericalDesign::~nmWxNumericalDesign()
}
}
// 激活当前成果面板,并刷新查看井结果下拉框
void nmWxNumericalDesign::activateCurrentInstance()
{
// 一个QMdiArea中可以同时打开多个成果窗口每个成果都有自己的数值解面板。
// 已经打开过的成果再次被激活时不会重新构造面板,因此需要在切换时更新静态指针。
s_pCurrentInstance = this;
// 调用前已经切换到当前成果的数据中心,此处按照当前成果重新填充下拉框。
fillResultWellCombo();
}
// 外部刷新当前查看井下拉框
void nmWxNumericalDesign::notifyResultWellSelectorChanged(const QString& wellName)
{

Loading…
Cancel
Save