开发项目中最重要的组成部分非数据莫属了,这里介绍一种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)

最低0.47元/天 解锁文章
1601

被折叠的 条评论
为什么被折叠?



