From f4f0bf149224d5f28460c7b28e46c494ff31743e Mon Sep 17 00:00:00 2001 From: lh <2334563547@qq.com> Date: Mon, 15 Jun 2026 17:05:05 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E=20nmWxParaPrope?= =?UTF-8?q?rtyPebi=EF=BC=9APEBI=E4=B8=93=E7=94=A8=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E7=AA=97=E5=8F=A3=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20nmGridRowUtils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h | 73 +++++ Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp | 260 ++++++++++++++++++ 2 files changed, 333 insertions(+) create mode 100644 Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h create mode 100644 Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp diff --git a/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h b/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h new file mode 100644 index 0000000..5ef7ac7 --- /dev/null +++ b/Include/nmNum/nmSubWxs/nmWxParaPropertyPebi.h @@ -0,0 +1,73 @@ +#pragma once + +#include "iDlgBase.h" +#include "nmSubWxs_global.h" + +class nmGridRowUtils; + +/// @brief PEBI求解器专用的参数输入/编辑属性对话框窗体 +/// @note 与 nmWxParaProperty 结构一致,区别在于内部使用 nmGridRowUtils(NM子类) +/// 而非基类 iGridRowUtils,以隔离基类接口变更对NM模块的影响 +class NM_SUB_WXS_EXPORT nmWxParaPropertyPebi : public iDlgBase +{ + Q_OBJECT + +public: + + explicit nmWxParaPropertyPebi(QWidget* parent = 0); + ~nmWxParaPropertyPebi(); + + // 初始化 + virtual void initUI(); + void initUI_HelpBox(); + + /// @brief 刷新参数属性载体的入口 + /// @param listParas (in) 参数列表,可以是英文也可以是中文 + /// @param bReserveOlds (in) 是否保留原来,比如原先属性页已经有s和k,这时候新的列表里面也包括s和k + /// @note 参数列表必须是在系统中配置的参数,listParas已经包括了显示顺序 + /// 但对于层级,由系统配置来决定 + virtual void refreshUIs(QStringList& listParas, bool bReserveOlds = true); + + // 允许备份/恢复原有的参数内容 + virtual void backupOldParas(QMap& map, + QStringList& listParas); + virtual void restoreOldParas(QMap& map); + + // 从各个Wx中遍历查找,设置/获取参数值 + virtual bool setParaValue(QString sPara, QVariant o); + virtual bool getParaValue(QString sPara, QVariant& o); + + // 返回所有参数,Key为英文ID + virtual bool getAllParaValues(QMap& map, + bool bOnlyFitted = false, + bool bClearMap = true); + + virtual bool getAllParaUnits(QMap& map, + bool bOnlyFitted = false, + bool bClearMap = true); + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + +public slots: + + // help msg + virtual void slotHelpMsg(QString& s); + +protected: + + virtual void paintEvent(QPaintEvent*); + +protected: + + // 布局器 + QVBoxLayout* m_pMainLayout; + + // 属性参数列表及载体(使用NM子类) + QStringList m_listParas; + nmGridRowUtils* m_pGridItemUtils; + + // Help + QTextEdit* m_pHelpBox; +}; diff --git a/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp new file mode 100644 index 0000000..822b63e --- /dev/null +++ b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp @@ -0,0 +1,260 @@ + +#include "zxLogInstance.h" +#include "ZxResolutionHelper.h" +#include "zxSysUtils.h" + +#include "mModuleDefines.h" + +#include "iParaItemCtrl.h" +#include "iParameterUtils.h" + +#include "iGridRowItem.h" +#include "nmGridRowUtils.h" + +#include "nmWxParaPropertyPebi.h" + +nmWxParaPropertyPebi::nmWxParaPropertyPebi(QWidget* parent) : + iDlgBase(parent) +{ + m_pMainLayout = nullptr; + m_listParas.clear(); + m_pGridItemUtils = nullptr; + m_pHelpBox = nullptr; + + setWindowTitle(tr("Numerical para property")); +} + +nmWxParaPropertyPebi::~nmWxParaPropertyPebi() +{ + if (nullptr != m_pGridItemUtils) + { + delete m_pGridItemUtils; + m_pGridItemUtils = nullptr; + } +} + +void nmWxParaPropertyPebi::initUI() +{ + m_pMainLayout = new QVBoxLayout(); + Q_ASSERT(nullptr != m_pMainLayout); + m_pMainLayout->setSpacing(0); + m_pMainLayout->setMargin(0); + m_pMainLayout->setSizeConstraint(QVBoxLayout::SetMinAndMaxSize); + + // 以ScrollArea来显示,出现滚动条 + { + QWidget* pWxBk = new QWidget(); + Q_ASSERT(nullptr != pWxBk); + pWxBk->setContextMenuPolicy(Qt::CustomContextMenu); + pWxBk->setAutoFillBackground(true); + pWxBk->setLayout(m_pMainLayout); + + // Area, 设置Widget + QScrollArea* pArea = new QScrollArea(); + pArea->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + pArea->setWidgetResizable(true); + pArea->setWidget(pWxBk); + pArea->setContextMenuPolicy(Qt::CustomContextMenu); + + // Layout, 设置Area + QVBoxLayout* pLayoutBk = new QVBoxLayout(); + pLayoutBk->setSpacing(0); + pLayoutBk->setMargin(0); + pLayoutBk->addWidget(pArea); + + initUI_HelpBox(); + if (nullptr != m_pHelpBox) + { + pLayoutBk->addWidget(m_pHelpBox); + } + + setLayout(pLayoutBk); + } +} + +void nmWxParaPropertyPebi::initUI_HelpBox() +{ + // Sub: HelpBox + m_pHelpBox = new QTextEdit(); + Q_ASSERT(nullptr != m_pHelpBox); + + m_pHelpBox->setMaximumHeight(_resoSizeH(65)); + m_pHelpBox->setReadOnly(true); +} + +void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds /*= true*/) +{ + if (nullptr == m_pMainLayout) + { + return; + } + + m_listParas = listParas; + + // 备份原有的参数内容 + QMap mapOldParas; + mapOldParas.clear(); + if (bReserveOlds) + { + backupOldParas(mapOldParas, listParas); + } + + // Clear Old + QVBoxLayout* pLayout = m_pMainLayout; + clearChildrenOfLayout(pLayout, this); + + // 创建PEBI求解器专用的GridRowUtils + m_pGridItemUtils = new nmGridRowUtils(true); + Q_ASSERT(nullptr != m_pGridItemUtils); + m_pGridItemUtils->setParent(this); + m_pGridItemUtils->setParaSrcTag(s_Nm_Serie); + connect(m_pGridItemUtils, SIGNAL(sigHelpMsg(QString&)), + this, SLOT(slotHelpMsg(QString&))); + m_pMainLayout->addWidget(m_pGridItemUtils); + m_pGridItemUtils->buildRowUtils(listParas, false, this); + + // 恢复原有的参数内容 + if (bReserveOlds && !mapOldParas.isEmpty()) + { + restoreOldParas(mapOldParas); + } +} + +void nmWxParaPropertyPebi::backupOldParas(QMap& map, + QStringList& listParas) +{ + map.clear(); + if (nullptr != m_pGridItemUtils) + { + foreach (QString s, listParas) + { + map[s] = m_pGridItemUtils->getItemValueByPara(s); + } + } +} + +void nmWxParaPropertyPebi::restoreOldParas(QMap& map) +{ + if (nullptr == m_pGridItemUtils) + return; + + // 恢复先前备份的数据 + QMap::iterator iter = map.begin(); + for (; iter != map.end(); iter++) + { + QString sPara = iter.key(); + + iParameter* p = _paraHelper->getPara(sPara, s_Nm_Serie); + if (nullptr == p || p->m_bReadonly) + { + continue; + } + + QVariant o = iter.value(); + if (!o.isValid()) + { + continue; + } + m_pGridItemUtils->setParaValue(sPara, o); + } +} + +bool nmWxParaPropertyPebi::setParaValue(QString sPara, QVariant o) +{ + if (nullptr != m_pGridItemUtils && + m_pGridItemUtils->setParaValue(sPara, o)) + { + return true; + } + + return false; +} + +bool nmWxParaPropertyPebi::getParaValue(QString sPara, QVariant& o) +{ + if (nullptr != m_pGridItemUtils) + { + if (m_pGridItemUtils->getParaValue(sPara, o)) + { + return true; + } + } + + return false; +} + +bool nmWxParaPropertyPebi::getAllParaValues(QMap& map, + bool bOnlyFitted/* = false*/, + bool bClearMap /*= true*/) +{ + if (bClearMap) + { + map.clear(); + } + if (nullptr != m_pGridItemUtils) + { + if (!m_pGridItemUtils->getAllParaValues(map, bOnlyFitted, false)) + { + return false; + } + } + return true; +} + +bool nmWxParaPropertyPebi::getAllParaUnits(QMap& map, + bool bOnlyFitted/* = false*/, + bool bClearMap /*= true*/) +{ + if (nullptr != m_pGridItemUtils && + !m_pGridItemUtils->getAllParaUnits(map, bOnlyFitted, false)) + { + return false; + } + + return true; +} + +void nmWxParaPropertyPebi::onSerialize(ZxSerializer* ser) +{ + iDlgBase::onSerialize(ser); + + ser->write("ParaLists", m_listParas); + if (nullptr != m_pGridItemUtils) + { + m_pGridItemUtils->onSerialize(ser); + } +} + +void nmWxParaPropertyPebi::onDeserialize(ZxSerializer* ser) +{ + iDlgBase::onDeserialize(ser); + + m_bUnableSP = true; + + m_listParas.clear(); + ser->read("ParaLists", m_listParas); + + refreshUIs(m_listParas); + + if (nullptr != m_pGridItemUtils) + { + m_pGridItemUtils->onDeserialize(ser); + } + + m_bUnableSP = false; +} + +// help msg +void nmWxParaPropertyPebi::slotHelpMsg(QString& s) +{ + if (nullptr == m_pHelpBox) + { + return; + } + m_pHelpBox->setHtml(s); +} + +void nmWxParaPropertyPebi::paintEvent(QPaintEvent* e) +{ + iDlgBase::paintEvent(e); +}