【QT】QT通过数据封装实现Json结构和数据类之间的相互转换

开发项目中最重要的组成部分非数据莫属了,这里介绍一种QT项目中的数据封装方法。方法中封装的数据能进行自我监测,发生变化之后主动向外部发送消息通知变化,同时封装的数据可以实现与JSON数据结构之间的相互转换,这对于数据持久化和网络请求是很有帮助的。

基本类型封装

为了提升代码的复用性,这里我们将通用的方法和属性与基本的属性类型封装到一起,方便程序的调用。基本类型之间的继承关系如下图所示:

在这里插入图片描述

DatabDecorator是数据封装的基类,包含了数据内容的一些通用属性
StringDecorator是对字符串类型的属性的封装
IntDecorator是对整型类型的属性的封装
EnumeratorDecorator是对枚举类型的数据的封装
DateTimeDecorator是对日期类型的数据的封装

基本类型的数据基类如下,封装了属性字段需要的额外的辅助参数,以及与Json结构之间相互转化的方法接口

1、datadecorator.h

#ifndef DATADECORATOR_H
#define DATADECORATOR_H

#include <QJsonObject>
#include <QJsonValue>
#include <QObject>
#include <QScopedPointer>

class Entity;
class DataDecorator : public QObject
{
   
   
    Q_OBJECT
    //导出QML中需要访问属性
    Q_PROPERTY( QString ui_describe READ label CONSTANT )
public:
    /**@brief 构造描述
   * @1 该属性字段属于哪个数据实体
   * @2 该属性字段对应的key值
   * @3 该属性字段对应的描述信息
   */
    DataDecorator(Entity* parent = nullptr, const QString& key = "SomeItemKey", const QString& label = "");
    virtual ~DataDecorator();

    const QString& key() const;   //key值用来查找该属性
    const QString& label() const; //label用来描述该属性字段
    Entity* parentEntity();       //属性字段属于哪个数据实体(比如用户等)

    //Json和数据类之间的相互转化
    virtual QJsonValue jsonValue() const = 0;
    virtual void update(const QJsonObject& jsonObject) = 0;

private:
    //私有的数据类
    class Implementation;
    QScopedPointer<Implementation> implementation;
};
#endif

2、datadecorator.cpp

#include "data-decorator.h"
class DataDecorator::Implementation
{
   
   
public:
    Implementation(Entity* _parent, const QString& _key, const QString& _label)
        : parentEntity(_parent)
        , key(_key)
        , label(_label)
    {
   
   
    }
    Entity* parentEntity{
   
   nullptr};
    QString key;
    QString label;
};

DataDecorator::DataDecorator(Entity* parent, const QString& key, const QString& label)
    : QObject((QObject*)parent)
{
   
   
    implementation.reset(new Implementation(parent, key, label));
}
DataDecorator::~DataDecorator()
{
   
   
}
const QString& DataDecorator::key() const
{
   
   
    return implementation->key;
}

const QString& DataDecorator::label() const
{
   
   
    return implementation->label;
}

Entity* DataDecorator::parentEntity()
{
   
   
    return implementation->parentEntity;
}

基本类型的封装类派生自DataDecorator类,实现如下:

1.对字符串类型的封装

1、stringdecorator.h

#ifndef STRINGDECORATOR_H
#define STRINGDECORATOR_H

#include <QJsonObject>
#include <QJsonValue>
#include <QObject>
#include <QScopedPointer>
#include <QString>
#include <data/data-decorator.h>

class  StringDecorator : public DataDecorator
{
   
   
    Q_OBJECT
   //QML访问的属性
    Q_PROPERTY( QString ui_value READ value WRITE setValue NOTIFY valueChanged )
public:
    StringDecorator(Entity* parentEntity = nullptr, const QString& key = "SomeItemKey", const QString& label = "", const QString& value = "");
    ~StringDecorator();

    //修改和获取字符串封装类型中的原始数据
    StringDecorator& setValue(const QString& value);
    const QString& value() const;

    QJsonValue jsonValue() const override;
    void update(const QJsonObject& jsonObject) override;

signals:
    //数据发生变化的时候发送的信号
    void valueChanged();

private:
    class Implementation;
    QScopedPointer<Implementation> implementation;
};

#endif

2、stringdecorator.cpp

#include "string-decorator.h"
#include <QVariant>

class StringDecorator::Implementation
{
   
   
public:
    Implementation(StringDecorator* _stringDecorator, const QString& _value)
        : stringDecorator(_stringDecorator)
        , value(_value)
    {
   
   
    }

    StringDecorator* stringDecorator{
   
   nullptr};
    QString value;
};

StringDecorator::StringDecorator(Entity* parentEntity, const QString& key, const QString& label, const QString& value)
    : DataDecorator(parentEntity, key, label)
{
   
   
    implementation.reset(new Implementation(this, value));
}

StringDecorator::~StringDecorator()
{
   
   
}

const QString& StringDecorator::value() const
{
   
   
    return implementation->value;
}

StringDecorator& StringDecorator::setValue(const QString& value)
{
   
   
    if(value != implementation->value) {
   
   
        implementation->value = value;
        emit valueChanged();
    }
    return *this;
}

QJsonValue StringDecorator::jsonValue() const
{
   
   
    return QJsonValue::fromVariant(QVariant(implementation->value));
}

void StringDecorator::update(const QJsonObject& _jsonObject)
{
   
   
    if (_jsonObject.contains(key())) {
   
   
        setValue(_jsonObject.value(key()).toString());
    }
}
2.对整型的封装

1、intdecorator.h

#ifndef INTDECORATOR_H
#define INTDECORATOR_H

#include <QJsonObject>
#include <QJsonValue>
#include <QObject>
#include <QScopedPointer>
#include <data/data-decorator.h>

class  IntDecorator : public DataDecorator
{
   
   
    Q_OBJECT
   // QML访问的接口
    Q_PROPERTY( int ui_value READ value WRITE setValue NOTIFY valueChanged )

public:
    IntDecorator(Entity* parentEntity = nullptr, const QString& key = "SomeItemKey", const QString& label = "", int value = 0);
    ~IntDecorator();
 
    //修改和获取对应的属性值
    IntDecorator& setValue(int value);
    int value() const;

public:
    QJsonValue jsonValue() const override;
    void update(const QJsonObject& jsonObject) override;

signals:
    void valueChanged();

private:
    class Implementation;
    QScopedPointer<Implementation> implementation;
};

#endif

2、intdecorator.cpp

#include "int-decorator.h"
#include <QVariant>

class IntDecorator::Implementation
{
   
   
public:
    Implementation(IntDecorator* intDecorator, int value)
        : intDecorator(intDecorator)
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cappuccino-jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值