#pragma once #include "nmSubWxs_global.h" #include #include #include #include #include class iParameter; class iUnitGroup; class QComboBox; class QGridLayout; class QLabel; class QLineEdit; /** @brief 通用参数字段的编辑器类型。 */ enum nmParameterEditorType { NM_PARAMETER_EDITOR_NUMBER = 0, ///< 浮点数输入框。 NM_PARAMETER_EDITOR_INTEGER, ///< 整数输入框。 NM_PARAMETER_EDITOR_ENUM, ///< 稳定code枚举下拉框。 NM_PARAMETER_EDITOR_TEXT ///< 文本输入框。 }; /** @brief 通用枚举下拉框选项。 */ struct NM_SUB_WXS_EXPORT nmParameterEnumOption { QString m_sCode; ///< 不随语言变化的业务代码。 QString m_sText; ///< 当前语言下的显示文本。 }; /** * @brief 通用参数字段描述。 * @note 稳定参数ID用于业务读写,基础参数ID用于读取XML单位、精度和范围。 */ struct NM_SUB_WXS_EXPORT nmParameterFieldInfo { /** @brief 创建默认启用单位的数值字段描述。 */ nmParameterFieldInfo(); QString m_sParameterId; ///< 业务层稳定参数ID。 QString m_sBaseParameterId; ///< 参数XML中的基础参数ID。 QString m_sLabel; ///< 文本或枚举字段的显示名称。 nmParameterEditorType m_eEditorType; ///< 字段编辑器类型。 bool m_bUnitEnabled; ///< 是否创建单位下拉框。 QList m_listOptions; ///< 枚举字段的稳定选项。 }; /** * @brief 参数字段所需的最小单位服务接口。 * @note 窗口负责适配iDlgBase,字段不依赖具体业务窗口或全局对象。 */ class NM_SUB_WXS_EXPORT nmIParameterUnitService { public: /** @brief 析构单位服务接口。 */ virtual ~nmIParameterUnitService() {} /** @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 nmParameterField : public QObject { public: /** @brief 创建字段控件描述,控件在initialize()时按需生成。 */ nmParameterField(const nmParameterFieldInfo& oFieldInfo, nmIParameterUnitService* pUnitService, QObject* pParent = nullptr); /** @brief 释放字段对象;实际控件由所属Qt父控件管理。 */ virtual ~nmParameterField(); /** @brief 将字段控件加入指定分组网格。 */ bool initialize(QGridLayout* pLayout, int nRow, int nColumnOffset, QString& sError); /** @brief 返回业务层稳定参数ID。 */ QString parameterId() const; /** @brief 返回XML参数定义使用的基础参数ID。 */ QString baseParameterId() const; /** @brief 返回字段是否为枚举。 */ bool isEnum() const; /** @brief 返回字段是否为文本。 */ bool isText() 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 获取基准单位值或文本值。 */ QVariant baseValue(bool& bValid); /** @brief 设置枚举稳定code。 */ void setEnumCode(const QString& sCode); /** @brief 返回枚举稳定code。 */ QString enumCode() const; /** @brief 设置业务关联校验错误,空文字表示清除。 */ void setExternalValidationError(const QString& sError); /** @brief 校验当前输入并刷新提示。 */ bool validate(); /** @brief 同时显示或隐藏字段的全部控件。 */ void setFieldVisible(bool bVisible); /** @brief 返回字段是否参与编辑和校验。 */ bool isFieldVisible() const; /** @brief 返回文本或数值输入框。 */ QLineEdit* valueEditor() const; /** @brief 返回枚举下拉框。 */ QComboBox* enumEditor() const; private: /** @brief 创建数值输入框,并按XML参数定义绑定单位和范围。 */ bool createNumericEditor(QGridLayout* pLayout, int nRow, int nColumnOffset, QString& sError); /** @brief 创建不参与单位换算的文本输入框。 */ void createTextEditor(QGridLayout* pLayout, int nRow, int nColumnOffset); /** @brief 创建使用稳定业务code保存值的枚举下拉框。 */ void createEnumEditor(QGridLayout* pLayout, int nRow, int nColumnOffset); /** @brief 按XML精度规则格式化无单位绑定的基准数值。 */ QString formatBaseValue(double dValue) const; /** @brief 根据校验状态统一刷新文字颜色和参数提示。 */ void updateValidationAppearance(bool bValid); nmParameterFieldInfo m_oFieldInfo; ///< 稳定字段描述。 nmIParameterUnitService* m_pUnitService; ///< 注入的单位服务,不拥有所有权。 iParameter* m_pParameter; ///< 共享XML参数定义,不拥有所有权。 QLabel* m_pLabel; ///< 参数名称标签。 QLineEdit* m_pLineEdit; ///< 文本或数值输入框。 QComboBox* m_pValueComboBox; ///< 枚举值下拉框。 QComboBox* m_pUnitComboBox; ///< 单位下拉框。 QLabel* m_pUnitLabel; ///< 无单位字段的空白对齐占位。 QColor m_clrNormalText; ///< 输入框默认文字颜色。 QString m_sExternalValidationError; ///< 业务关联校验错误。 bool m_bVisible; ///< 字段是否参与编辑。 };