解析 UI,Common, clientViewMargin,left
GetValue(“UI”,“Common”, “clientViewMargin”,“left”,“\0”);
{
"UI": {
"Common": {
"commonFontSize": 24,
"listTextFontSize": 30,
"listItemHeight": 80,
"buttonFontSize": 24,
"clientViewMargin": {
"left": 20,
"right": 20,
"top": 0,
"bottom": 0
}
}
}
}
#pragma once
#include <QFile>
#include <QString>
#include <QVariant>
#include <QDateTime>
#include <QJsonObject>
class AppConfig
{
public:
AppConfig();
virtual ~AppConfig();
bool LoadConfig(const QString& path);
public:
QVariant GetValue(const char* format, ...); //("UI","title_panel", "height", "\0");最后必须加一个结束符
int32_t GetIntValue(const char* format, ...);
uint32_t GetUintValue(const char* format, ...);
double GetFloatValue(const char* format, ...);
QString GetStringValue(const char* format, ...);
QByteArray GetByteArrayValue(const char* format, ...);
QDateTime GetDateTimeValue(const char* format, ...);
private:
QVariant GetValueByKeys(QJsonValue jv, QList<QString> keys);
private:
QString mFilePath;
QJsonObject mJsonObj;
};
#include <QDebug>
#include <QJsonArray>
#include <QJsonDocument>
#include <QCoreApplication>
#include "AppConfig.h"
AppConfig::AppConfig()
{
}
AppConfig::~AppConfig()
{
}
bool AppConfig::LoadConfig(const QString& path)
{
if (path.isEmpty())
{
qDebug() << "error:open failed" << mFilePath;
return false;
}
mFilePath = path;
QFile file(mFilePath);
if (!file.open(QFile::ReadOnly))
{
FXC << "error:open failed" << mFilePath;
return false;
}
QByteArray ba = file.readAll();
file.close();
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(ba, &error);
if (doc.isNull() || (error.error != QJsonParseError::NoError))
{
return false;
}
doc.toJson(QJsonDocument::Compact);
mJsonObj = doc.object();
return true;
}
QVariant AppConfig::GetValue(const char* format, ...)
{
const char* para = NULL;
va_list args;
QList<QString> keys;
keys.push_back(format);
va_start(args, format);
do
{
para = va_arg(args, char*);
if (*para == '\0')
{
break;
}
keys.push_back(para);
} while (true);
va_end(args);
QJsonValue jv = mJsonObj;
return GetValueByKeys(jv, keys);
}
int32_t AppConfig::GetIntValue(const char* format, ...)
{
const char* para = NULL;
va_list args;
QList<QString> keys;
keys.push_back(format);
va_start(args, format);
do
{
para = va_arg(args, char*);
if (*para == '\0')
{
break;
}
keys.push_back(para);
} while (true);
va_end(args);
QJsonValue jv = mJsonObj;
return GetValueByKeys(jv, keys).toInt();
}
uint32_t AppConfig::GetUintValue(const char* format, ...)
{
const char* para = NULL;
va_list args;
QList<QString> keys;
keys.push_back(format);
va_start(args, format);
do
{
para = va_arg(args, char*);
if (*para == '\0')
{
break;
}
keys.push_back(para);
} while (true);
va_end(args);
QJsonValue jv = mJsonObj;
return GetValueByKeys(jv, keys).toUInt();
}
double AppConfig::GetFloatValue(const char* format, ...)
{
const char* para = NULL;
va_list args;
QList<QString> keys;
keys.push_back(format);
va_start(args, format);
do
{
para = va_arg(args, char*);
if (*para == '\0')
{
break;
}
keys.push_back(para);
} while (true);
va_end(args);
QJsonValue jv = mJsonObj;
return GetValueByKeys(jv, keys).toDouble();
}
QString AppConfig::GetStringValue(const char* format, ...)
{
const char* para = NULL;
va_list args;
QList<QString> keys;
keys.push_back(format);
va_start(args, format);
do
{
para = va_arg(args, char*);
if (*para == '\0')
{
break;
}
keys.push_back(para);
} while (true);
va_end(args);
QJsonValue jv = mJsonObj;
return GetValueByKeys(jv, keys).toString();
}
QByteArray AppConfig::GetByteArrayValue(const char* format, ...)
{
const char* para = NULL;
va_list args;
QList<QString> keys;
keys.push_back(format);
va_start(args, format);
do
{
para = va_arg(args, char*);
if (*para == '\0')
{
break;
}
keys.push_back(para);
} while (true);
va_end(args);
QJsonValue jv = mJsonObj;
QVariant value = GetValueByKeys(jv, keys);
QJsonValue jvalue = value.toJsonValue();
if (!jvalue.isArray())
{
return QByteArray();
}
QByteArray ba;
QJsonArray jarr = jvalue.toArray();
for (int32_t i = 0; i < jarr.size(); i++)
{
ba.push_back((char)jarr[i].toInt());
}
return ba;
}
QDateTime AppConfig::GetDateTimeValue(const char* format, ...)
{
const char* para = NULL;
va_list args;
QList<QString> keys;
keys.push_back(format);
va_start(args, format);
do
{
para = va_arg(args, char*);
if (*para == '\0')
{
break;
}
keys.push_back(para);
} while (true);
va_end(args);
QJsonValue jv = mJsonObj;
return GetValueByKeys(jv, keys).toDateTime();
}
QVariant AppConfig::GetValueByKeys(QJsonValue jv, QList<QString> keys)
{
int32_t keyNum = keys.count();
for (int32_t i = 0; i < keyNum; ++i)
{
QString key = keys[i];
if (!jv.isObject() || !jv.toObject().contains(key))
{
break;
}
if (i == (keyNum - 1))
{
return jv.toObject().value(key);
}
jv = jv.toObject().value(key);
}
return QVariant();
}