You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmData/nmAttrRegistry.h

63 lines
1.9 KiB
C

#pragma once
#include <QObject>
#include <QMap>
#include <QString>
#include <QStringList>
#include <QVariant>
#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<QString, QVariant> 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<QString, nmDataAttribute*> m_nameToPtr; // name → ptr
QMap<nmDataAttribute*, QString> m_ptrToName; // ptr → namesender 反查用)
bool m_bSyncing; // 防循环标记
};