diff --git a/Include/nmNum/nmGUI/nmGridRowUtils.h b/Include/nmNum/nmGUI/nmGridRowUtils.h index 9b91cc3..6db49ee 100644 --- a/Include/nmNum/nmGUI/nmGridRowUtils.h +++ b/Include/nmNum/nmGUI/nmGridRowUtils.h @@ -156,7 +156,7 @@ protected: virtual void connectSignalsOf(iGridRowItem* p) override; /// @brief 参数项创建完成后的绑定处理(如产液段与有效长度的关联) - virtual void bindItems() override; + virtual void dealwithItemBinds() override; // ================================================================ // 多井分组内部方法 @@ -183,9 +183,20 @@ public slots: /// @param bOk 是否成功获取 virtual void slotGetValueOf(QString sPara, QVariant& o, bool& bOk) override; +private slots: + + /// @brief 单位换算完成后,使用最新基准值重新提交参数 + void slotUnitEditorEditingFinished(); + private: + /// @brief 连接所有带单位输入框的最终提交信号 + void connectUnitEditorCommitSignals(); + /// @brief 井名映射(wellCode → 显示名) QMap m_mapWellNames; + /// @brief 输入框与对应单位参数项的映射 + QMap m_mapUnitEditorItems; + }; diff --git a/Src/nmNum/nmGUI/nmGridRowUtils.cpp b/Src/nmNum/nmGUI/nmGridRowUtils.cpp index a959903..22df202 100644 --- a/Src/nmNum/nmGUI/nmGridRowUtils.cpp +++ b/Src/nmNum/nmGUI/nmGridRowUtils.cpp @@ -2,6 +2,7 @@ #include "iGridRowGroup.h" #include "iParameter.h" #include "iSysParaHelper.h" +#include // 井编码可能互为前缀,拆分参数时必须优先匹配更长的编码。 static bool longerStringFirst(const QString& a, const QString& b) @@ -93,7 +94,7 @@ bool nmGridRowUtils::buildRowUtils(QStringList listParas, // 对象分组追加完成后,重新备份、绑定、计算布局。 bkAllItems(); - bindItems(); + dealwithItemBinds(); double h = getUtilHeight(); QRectF rt = QRectF(0, 0, 300, h); @@ -101,6 +102,8 @@ bool nmGridRowUtils::buildRowUtils(QStringList listParas, setMinimumHeight(h); } + connectUnitEditorCommitSignals(); + return true; } @@ -269,9 +272,47 @@ void nmGridRowUtils::connectSignalsOf(iGridRowItem* p) iGridRowUtils::connectSignalsOf(p); } -void nmGridRowUtils::bindItems() +void nmGridRowUtils::dealwithItemBinds() +{ + iGridRowUtils::dealwithItemBinds(); +} + +void nmGridRowUtils::connectUnitEditorCommitSignals() { - iGridRowUtils::bindItems(); + foreach (iGridRowItem* pItem, m_vecAllItems) + { + iGridRowItemUnt* pUnitItem = qobject_cast(pItem); + if (pUnitItem == nullptr) + { + continue; + } + + QLineEdit* pEditor = qobject_cast(pUnitItem->getMainEditor()); + if (pEditor == nullptr || m_mapUnitEditorItems.contains(pEditor)) + { + continue; + } + + m_mapUnitEditorItems.insert(pEditor, pUnitItem); + connect(pEditor, SIGNAL(editingFinished()), + this, SLOT(slotUnitEditorEditingFinished()), + Qt::QueuedConnection); + } +} + +void nmGridRowUtils::slotUnitEditorEditingFinished() +{ + QLineEdit* pEditor = qobject_cast(sender()); + iGridRowItemUnt* pUnitItem = m_mapUnitEditorItems.value(pEditor, nullptr); + if (pEditor == nullptr || pUnitItem == nullptr) + { + return; + } + + // Binder在editingFinished中更新基准值;排队到其后再走参数项原有提交通道。 + QMetaObject::invokeMethod(pUnitItem, "slotItemValueChanged", + Qt::DirectConnection, + Q_ARG(QString, pEditor->text())); } // ================================================================