#pragma once #include #include #include #include #include #include "nmData_global.h" class nmDataAttribute; /// @brief 属性注册表,作为 UI 与数据层的双向同步中介 /// @note 每个分析窗口(nmDataAnalyzeManager)持有一个实例 /// name 对齐 XML ParaItem Name(如 "Pi", "K", "h") /// nmDataReservoir/nmSubWndUtils 不需任何修改 class NM_DATA_EXPORT nmAttrRegistry : public QObject { Q_OBJECT public: explicit nmAttrRegistry(QObject* parent = nullptr); ~nmAttrRegistry(); /// @brief 注册属性,name 对齐 XML ParaItem Name /// @param name 参数名(如 "Pi", "K", "h") /// @param pAttr nmDataAttribute 指针(不拥有所有权) void regAttr(QString name, nmDataAttribute* pAttr); /// @brief 清除所有注册(重建数据对象时调用) void clear(); /// @brief 批量读取属性值(初始化面板用) /// @param names 参数名列表 /// @return name→value 映射,未找到的跳过 QMap collect(const QStringList& names) const; public slots: /// @brief UI→Data 方向:按 name dispatch 到 nmDataAttribute::setValue /// @note 内部设置 m_bSyncing=true 防循环 void setValue(QString name, QVariant value); signals: /// @brief Data→UI 方向:属性变更通知,携带 name 和新值 void sigAttrChanged(QString name, QVariant value); private slots: /// @brief 监听 nmDataAttribute::sigValueChanged,用 sender() 反查 name void onAttrValueChanged(); /// @brief 监听 nmDataAttribute::destroyed,自动清理映射 void onAttrDestroyed(QObject* pObj); private: QMap m_nameToPtr; // name → ptr QMap m_ptrToName; // ptr → name(sender 反查用) bool m_bSyncing; // 防循环标记 };