#pragma once #include "nmSubWxs_global.h" #include "nmReservoirParameterCatalog.h" #include #include class iParameter; class iUnitGroup; class QComboBox; class QGridLayout; class QLabel; class QLineEdit; /** * @brief 储层参数字段所需的最小单位服务接口。 * @note 主对话框负责适配iDlgBase,字段不直接依赖对话框基类或全局对象。 */ class NM_SUB_WXS_EXPORT nmIReservoirParameterUnitService { public: /** @brief 析构单位服务接口。 */ virtual ~nmIReservoirParameterUnitService() {} /** @brief 按NM参数定义绑定一个数值编辑器和单位下拉框。 */ virtual bool bindUnitField(QLineEdit* pLineEdit, QComboBox* pUnitComboBox, const QString& sBaseParameterId) = 0; /** @brief 将基准单位数值写入指定编辑器。 */ virtual void setUnitBaseValue(QLineEdit* pLineEdit, double dBaseValue) = 0; /** @brief 读取指定编辑器的基准单位数值。 */ virtual double unitBaseValue(QLineEdit* pLineEdit) const = 0; /** @brief 校验指定单位编辑器。 */ virtual bool isUnitInputValid(QLineEdit* pLineEdit) = 0; /** @brief 返回指定编辑器当前显示单位。 */ virtual QString currentUnit(QLineEdit* pLineEdit) const = 0; /** @brief 返回指定编辑器的单位组,不转移所有权。 */ virtual iUnitGroup* unitGroup(QLineEdit* pLineEdit) const = 0; }; /** * @brief 原型式参数行的轻量逻辑单元。 * @note 本类不创建外框或子面板,只把标签、编辑器和单位控件直接加入分组网格。 */ class NM_SUB_WXS_EXPORT nmReservoirParameterField : public QObject { public: /** * @brief 构造参数字段。 * @param oFieldInfo 稳定字段描述。 * @param pUnitService 主对话框注入的单位服务,不转移所有权。 * @param pParent 字段生命周期父对象。 */ nmReservoirParameterField( const nmReservoirParameterFieldInfo& oFieldInfo, nmIReservoirParameterUnitService* pUnitService, QObject* pParent = nullptr); /** @brief 析构字段,不单独删除由分组控件拥有的界面控件。 */ virtual ~nmReservoirParameterField(); /** * @brief 将字段的三个直接控件加入分组网格。 * @param pLayout 所属分组的网格布局。 * @param nRow 字段所在行。 * @param nColumnOffset 字段起始列偏移。 * @param sError 初始化失败原因。 * @return 参数元数据和单位绑定均成功时返回true。 */ bool initialize(QGridLayout* pLayout, int nRow, int nColumnOffset, QString& sError); /** @brief 返回编辑会话使用的稳定参数ID。 */ QString parameterId() const; /** @brief 返回XML参数定义使用的基础参数ID。 */ QString baseParameterId() const; /** @brief 返回字段是否为稳定code枚举。 */ bool isEnum() const; /** @brief 设置数值输入文字是否右对齐。 */ void setValueRightAligned(bool bRightAligned); /** @brief 返回数值编辑列的统一最小宽度。 */ static int editorMinimumWidth(); /** @brief 返回单位列的统一最小宽度。 */ static int unitMinimumWidth(); /** @brief 返回输入框和下拉框的统一紧凑高度。 */ static int editorHeight(); /** @brief 设置基准单位下的数值并刷新显示。 */ void setBaseValue(const QVariant& oValue); /** * @brief 获取基准单位下的当前数值。 * @param bValid 输出当前输入是否有效。 * @return 有效时返回基准值,否则返回无效QVariant。 */ QVariant baseValue(bool& bValid); /** @brief 设置枚举稳定code;不会触发业务联动。 */ void setEnumCode(const QString& sCode); /** @brief 返回当前枚举稳定code。 */ QString enumCode() const; /** @brief 校验当前输入,并更新参数范围提示。 */ bool validate(); /** @brief 同时显示或隐藏该参数行的三个直接控件。 */ void setFieldVisible(bool bVisible); /** @brief 返回参数行当前是否参与编辑和校验。 */ bool isFieldVisible() const; /** @brief 返回数值输入框,供页面集中连接变化信号。 */ QLineEdit* valueEditor() const; /** @brief 返回枚举下拉框,供页面集中连接变化信号。 */ QComboBox* enumEditor() const; private: /** @brief 创建数值输入框及单位控件。 */ bool createNumericEditor(QGridLayout* pLayout, int nRow, int nColumnOffset, QString& sError); /** @brief 创建稳定code枚举下拉框。 */ void createEnumEditor(QGridLayout* pLayout, int nRow, int nColumnOffset); /** @brief 按XML精度格式化无单位或整数参数。 */ QString formatBaseValue(double dValue) const; /** @brief 更新输入框的有效状态和帮助文字。 */ void updateValidationAppearance(bool bValid); nmReservoirParameterFieldInfo m_oFieldInfo; ///< 稳定字段描述。 nmIReservoirParameterUnitService* m_pUnitService; ///< 注入的单位服务,不拥有所有权。 iParameter* m_pParameter; ///< 共享XML参数定义,不拥有所有权。 QLabel* m_pLabel; ///< 参数名称标签。 QLineEdit* m_pLineEdit; ///< 数值输入框。 QComboBox* m_pValueComboBox; ///< 枚举值下拉框。 QComboBox* m_pUnitComboBox; ///< 可换算单位下拉框。 QLabel* m_pUnitLabel; ///< 无单位字段的空白对齐占位。 bool m_bVisible; ///< 参数行是否参与编辑。 bool m_bUpdating; ///< 程序写值时阻止业务信号。 };