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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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; // 防循环标记
};