需求:增加xml模块
#ifndef UICONFIG_H
#define UICONFIG_H
#include <QMutex>
#include <QDomDocument>
#include <QDomElement>
#include <QFile>
#include <QString>
class UiConfig
{
public:
typedef enum e_uiconfig
{
E_INDEX_ROOT = 0,
E_INDEX_VERSION,
E_INDEX_VENTBARLAY,
E_INDEX_MAX
}E_UICONFIG;
public:
static UiConfig * getInstance();
QString getConfigValue(E_UICONFIG name);
void setConfigValue(QString name, int value);
private:
explicit UiConfig();
~UiConfig();
bool load();
void initDefaultConfig();
bool checkVersion();
private:
QMutex m_mutex;
QDomDocument m_doc;
QString m_path;
QFile *m_file;
struct ST_ELEMENT{
E_UICONFIG id;
QString tagname;
QString value;
} *m_xmlEleArray;
};
#endif // UICONFIG_H
cpp
#include "UiConfig.h"
#include <QCoreApplication>
#include <QDebug>
UiConfig *UiConfig::getInstance()
{
static UiConfig instance;
return &instance;
}
QString UiConfig::getConfigValue(E_UICONFIG tagindex)
{
QString tagname = m_xmlEleArray[tagindex].tagname;
QDomElement root = m_doc.firstChildElement("root");
QDomElement targetNode = root.firstChildElement(tagname);
QString val = "";
if (targetNode.isNull())
{
qDebug() << "Failed to get XML value:";
val = "-999";
return val;
}
val = targetNode.text();
return val;
}
UiConfig::UiConfig()
:m_file(nullptr)
,m_xmlEleArray(nullptr)
{
m_xmlEleArray = new ST_ELEMENT[E_INDEX_MAX]
{
{E_INDEX_ROOT, "root", ""},
{E_INDEX_VERSION, "Version", "1"},
{E_INDEX_VENTBARLAY, "VentBarLayout", "16"},
};
m_path = QCoreApplication::applicationDirPath() +"/UiConfig.xml";
m_file = new QFile(m_path);
checkVersion();
if(!load())
{
initDefaultConfig();
load();
}
}
UiConfig::~UiConfig()
{
if (m_file)
{
if (m_file->isOpen())
{
m_file->close();
}
m_file = nullptr;
delete m_file;
}
if (m_xmlEleArray)
{
delete [] m_xmlEleArray;
m_xmlEleArray = nullptr;
}
}
bool UiConfig::load()
{
if (m_file->exists())
{
m_file->open(QIODevice::ReadWrite);
if (!m_doc.setContent(m_file))
{
qDebug() << "Failed to parse XML file:";
m_file->close();
m_doc.clear();
return -1;
}
}
return false;
}
void UiConfig::initDefaultConfig()
{
QDomElement root = m_doc.createElement(m_xmlEleArray[E_INDEX_ROOT].tagname);
m_doc.appendChild(root);
for(int i = 1 ; i < E_INDEX_MAX; ++i)
{
QDomElement version = m_doc.createElement(m_xmlEleArray[i].tagname);
version.appendChild(m_doc.createTextNode(m_xmlEleArray[i].value));
root.appendChild(version);
}
if(m_file->open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream stream(m_file);
stream << m_doc.toString(4);
m_file->close();
}
}
bool UiConfig::checkVersion()
{
if (m_file->exists())
{
m_file->open(QIODevice::ReadOnly);
if (m_doc.setContent(m_file))
{
if (m_xmlEleArray[E_INDEX_VERSION].value != getConfigValue(E_INDEX_VERSION))
{
m_file->close();
m_file->remove();
m_doc.clear();
return false;
}
}
m_file->close();
}
return true;
}