DAWorkbench 0.0.1
DAWorkbench API
载入中...
搜索中...
未找到
DAXMLFileInterface.h
1#ifndef DAXMLFILEINTERFACE_H
2#define DAXMLFILEINTERFACE_H
3#include <QString>
4#include "DAUtilsAPI.h"
5// #include "DAStringUtil.h"
6#include <QPen>
7#include <QFont>
8#include <QBrush>
9#include <QDomElement>
10#include <QPointF>
11#include <QVariant>
12#include <QIODevice>
13#include <QVector3D>
14#include <QVersionNumber>
15#include "da_qstring_cast.h"
16class QDomDocument;
17#ifndef DAXMLFILEINTERFACE_POD_NUMBER_H
18#define DAXMLFILEINTERFACE_TYPE_MAKE_H(pod_type) \
19 static QDomElement makeElement(const pod_type& v, const QString& tagName, QDomDocument* doc); \
20 static bool loadElement(pod_type& p, const QDomElement* ele);
21#endif
22namespace DA
23{
24
28class DAUTILS_API DAXMLFileInterface
29{
30public:
32 virtual ~DAXMLFileInterface();
33 // 保存到xml中
34 virtual bool saveToXml(QDomDocument* doc, QDomElement* parentElement, const QVersionNumber& ver) const = 0;
35 virtual bool loadFromXml(const QDomElement* parentElement, const QVersionNumber& ver) = 0;
36
37public:
38
39 DAXMLFILEINTERFACE_TYPE_MAKE_H(short)
40 DAXMLFILEINTERFACE_TYPE_MAKE_H(unsigned short)
41 DAXMLFILEINTERFACE_TYPE_MAKE_H(int)
42 DAXMLFILEINTERFACE_TYPE_MAKE_H(unsigned int)
43 DAXMLFILEINTERFACE_TYPE_MAKE_H(long)
44 DAXMLFILEINTERFACE_TYPE_MAKE_H(unsigned long)
45 DAXMLFILEINTERFACE_TYPE_MAKE_H(long long)
46 DAXMLFILEINTERFACE_TYPE_MAKE_H(unsigned long long)
47 DAXMLFILEINTERFACE_TYPE_MAKE_H(double)
48 DAXMLFILEINTERFACE_TYPE_MAKE_H(float)
49 DAXMLFILEINTERFACE_TYPE_MAKE_H(std::string)
50
51 // 标准保存—— QString
52 DAXMLFILEINTERFACE_TYPE_MAKE_H(QString)
53 DAXMLFILEINTERFACE_TYPE_MAKE_H(QColor)
54 DAXMLFILEINTERFACE_TYPE_MAKE_H(QRect)
55 DAXMLFILEINTERFACE_TYPE_MAKE_H(QRectF)
56 DAXMLFILEINTERFACE_TYPE_MAKE_H(QPoint)
57 DAXMLFILEINTERFACE_TYPE_MAKE_H(QPointF)
58 DAXMLFILEINTERFACE_TYPE_MAKE_H(QPen)
59 DAXMLFILEINTERFACE_TYPE_MAKE_H(QBrush)
60 DAXMLFILEINTERFACE_TYPE_MAKE_H(QFont)
61 DAXMLFILEINTERFACE_TYPE_MAKE_H(QVector3D)
62 DAXMLFILEINTERFACE_TYPE_MAKE_H(QVariant)
63
64
65 // stl类型 这是针对stl类型的xml保存
66 template< typename std_container_like >
67 static QDomElement makeElement(const std_container_like& v, const QString& tagName, QDomDocument* doc);
68 template< typename std_container_like >
69 static bool loadElement(std_container_like& v, const QDomElement* ele);
70
71
72 // 系统信息保存到xml
73 static QDomElement makeSysInfoElement(const QString& tagName, QDomDocument* doc);
74
75 // 在parent下,插入一个tag,tag下包含文字text
76 static void appendElementWithText(QDomElement& parent, const QString& tagName, const QString& text, QDomDocument* doc);
77};
78
79#ifndef DAXMLELEMENTSERIALIZATION_INOUT_H
80#define DAXMLELEMENTSERIALIZATION_INOUT_H(type) \
81 DAXMLElementSerialization& operator<<(const type& t); \
82 DAXMLElementSerialization& operator>>(type& t);
83#endif
84
106{
107public:
108 DAXMLElementSerialization(QDomElement* parentElement);
110 // clang-format off
111 DAXMLELEMENTSERIALIZATION_INOUT_H(short)
112 DAXMLELEMENTSERIALIZATION_INOUT_H(unsigned short)
113 DAXMLELEMENTSERIALIZATION_INOUT_H(int)
114 DAXMLELEMENTSERIALIZATION_INOUT_H(unsigned int)
115 DAXMLELEMENTSERIALIZATION_INOUT_H(long)
116 DAXMLELEMENTSERIALIZATION_INOUT_H(unsigned long)
117 DAXMLELEMENTSERIALIZATION_INOUT_H(long long)
118 DAXMLELEMENTSERIALIZATION_INOUT_H(unsigned long long)
119 DAXMLELEMENTSERIALIZATION_INOUT_H(double)
120 DAXMLELEMENTSERIALIZATION_INOUT_H(float)
121 DAXMLELEMENTSERIALIZATION_INOUT_H(std::string)
122 DAXMLELEMENTSERIALIZATION_INOUT_H(QString)
123 DAXMLELEMENTSERIALIZATION_INOUT_H(QColor)
124 DAXMLELEMENTSERIALIZATION_INOUT_H(QRect)
125 DAXMLELEMENTSERIALIZATION_INOUT_H(QRectF)
126 DAXMLELEMENTSERIALIZATION_INOUT_H(QPoint)
127 DAXMLELEMENTSERIALIZATION_INOUT_H(QPointF)
128 DAXMLELEMENTSERIALIZATION_INOUT_H(QPen)
129 DAXMLELEMENTSERIALIZATION_INOUT_H(QBrush)
130 DAXMLELEMENTSERIALIZATION_INOUT_H(QFont)
131 DAXMLELEMENTSERIALIZATION_INOUT_H(QVector3D)
132 DAXMLELEMENTSERIALIZATION_INOUT_H(QVariant)
133 // clang-format on
134private:
135 QDomElement* mParentElement { nullptr };
136 QDomElement mCurrentElement;
137};
138
139template< typename std_container_like >
140QDomElement DAXMLFileInterface::makeElement(const std_container_like& v, const QString& tagName, QDomDocument* doc)
141{
142 // using T = std_container_like::value_type;
143 auto ele = doc->createElement(tagName);
144 ele.setAttribute("class", QString("%1").arg(typeid(std_container_like).name()));
145 ele.setAttribute("size", v.size());
146 for (const auto& r : v) {
147 auto eleR = doc->createElement("r");
148 auto textNode = doc->createTextNode(toQString(r));
149 eleR.appendChild(textNode);
150 ele.appendChild(eleR);
151 }
152 return ele;
153}
154
155template< typename std_container_like >
156bool DAXMLFileInterface::loadElement(std_container_like& v, const QDomElement* ele)
157{
158 using T = typename std_container_like::value_type;
159 bool isok = false;
160 auto size = ele->attribute("size").toUInt(&isok);
161 if (!isok) {
162 return false;
163 }
164 v.resize(size);
165 auto cns = ele->childNodes();
166 for (int i = 0; i < cns.size(); ++i) {
167 auto rEle = cns.at(i).toElement();
168 if (rEle.tagName() != "r") {
169 continue;
170 }
171 T r;
172 if (!fromQString(rEle.text(), r)) {
173 continue;
174 }
175
176 v[ i ] = r;
177 }
178 return true;
179}
180
189DAUTILS_API QString variantToString(const QVariant& var);
190
197DAUTILS_API QVariant stringToVariant(const QString& var, const QString& typeName);
198
206DAUTILS_API QString doubleToString(double a);
212template< typename T >
213QString converVariantToBase64String(const QVariant& var)
214{
215 if (var.canConvert< T >()) {
216 QByteArray byte;
217 QDataStream st(&byte, QIODevice::ReadWrite);
218 T ba = var.value< T >();
219 st << ba;
220 return (QString(byte.toBase64()));
221 }
222 return (QString());
223}
224
230template< typename T >
231QVariant converBase64StringToVariant(const QString& base64)
232{
233 QByteArray byte = QByteArray::fromBase64(base64.toLocal8Bit());
234 QDataStream st(&byte, QIODevice::ReadWrite);
235 T ba;
236
237 st >> ba;
238 return (QVariant::fromValue(ba));
239}
240
241// 获取qreal值
242bool DAUTILS_API getStringIntValue(const QString& valuestring, int& v);
243bool DAUTILS_API getStringUIntValue(const QString& valuestring, unsigned int& v);
244bool DAUTILS_API getStringULongLongValue(const QString& valuestring, unsigned long long& v);
245bool DAUTILS_API getStringRealValue(const QString& valuestring, qreal& v);
246bool DAUTILS_API getStringBoolValue(const QString& valuestring);
247
248}
249
250#endif // DAXMLFILEINTERFACE_H
针对xml文件序列化,实现类似二进制文件一样<<和>>的序列化
Definition DAXMLFileInterface.h:106
所有支持xml文件保存的类继承于它,从而提供saveToXml和loadFromXml接口
Definition DAXMLFileInterface.h:29
static QDomElement makeElement(const std_container_like &v, const QString &tagName, QDomDocument *doc)
生成一个文本
Definition DAXMLFileInterface.cpp:151
static bool loadElement(std_container_like &v, const QDomElement *ele)
加载文本
Definition DAXMLFileInterface.cpp:167
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44
DAUTILS_API QString doubleToString(double a)
把double转换为字符串,并且尽量不丢失精度,不会转换为xxe-5这样的情况
Definition DAXMLFileInterface.cpp:1401
QVariant converBase64StringToVariant(const QString &base64)
把Base64字符转换为对应变量
Definition DAXMLFileInterface.h:231
DAUTILS_API QString variantToString(const QVariant &var)
QVariant转为QString
Definition DAXMLFileInterface.cpp:775
bool getStringIntValue(const QString &valuestring, int &v)
获取int值
Definition DAXMLFileInterface.cpp:717
bool getStringUIntValue(const QString &valuestring, unsigned int &v)
获取unsigned int值
Definition DAXMLFileInterface.cpp:730
QString converVariantToBase64String(const QVariant &var)
把QVariant转换为Base64字符
Definition DAXMLFileInterface.h:213
bool getStringBoolValue(const QString &valuestring)
获取为bool类型
Definition DAXMLFileInterface.cpp:768
bool getStringULongLongValue(const QString &valuestring, unsigned long long &v)
获取unsigned ll值
Definition DAXMLFileInterface.cpp:743
DAUTILS_API QVariant stringToVariant(const QString &var, const QString &typeName)
variantToString的逆方法
Definition DAXMLFileInterface.cpp:1059
bool getStringRealValue(const QString &valuestring, qreal &v)
获取qreal值
Definition DAXMLFileInterface.cpp:756
QString toQString(const T &value)
toQString
Definition da_qstring_cast.h:71
bool fromQString(const QString &str, T &result)
将QString转换为类型T,通过引用返回转换结果,并返回一个bool值表示转换是否成功
Definition da_qstring_cast.h:117