Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件

 

第一种INI配置文件

.ini 文件是Initialization File的缩写,即初始化文件

除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求。一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能。它可以用来存放软件信息,注册表信息等。

读INI文件

INI文件内容如下:

[conn]
ip=127.0.0.1
port=8080
databaseversion=QSQLITE
databasename=student
username=YYC
password=root

 

qreadini.h文件内容如下:

#ifndef QREADINI_H
#define QREADINI_H
#include<QSettings>


#define DATACONFIG  QReadIni::getInstance()->getIniConfig()


typedef struct IniConfig
{
    QString ip;                //IP地址
    QString port;              //端口
    QString dataBaseVersion;   //数据库版本
    QString dataBaseName;      //数据库名称
    QString userName;          //用户名
    QString passWord;          //密码
}IniConfig;


class QReadIni
{
public:
    static QReadIni*getInstance();


    void readIni();


    const IniConfig &getIniConfig();


private:
    QReadIni();


    IniConfig iniConfig;


    static QReadIni*instance;
};


#endif // QREADINI_H

 

qreadini.cpp文件内容如下:

#include "qreadini.h"


QReadIni*QReadIni::instance = NULL;


QReadIni *QReadIni::getInstance()
{
    if(instance == NULL)
    {
        instance = new QReadIni();
    }
    return instance;
}


QReadIni::QReadIni()
{
    this->readIni();
}


void QReadIni::readIni()
{
    QSettings * configIniRead = new QSettings("config.ini",QSettings::IniFormat);//初始化读取Ini文件对象
    iniConfig.ip = configIniRead->value("conn/ip").toString();                          //IP地址
    iniConfig.port = configIniRead->value("conn/port").toString();                      //端口
    iniConfig.dataBaseVersion = configIniRead->value("conn/databaseversion").toString();//数据库版本
    iniConfig.dataBaseName = configIniRead->value("conn/databasename").toString();      //数据库名称
    iniConfig.userName = configIniRead->value("conn/username").toString();              //用户名
    iniConfig.passWord = configIniRead->value("conn/password").toString();              //密码


    delete configIniRead;
}


const IniConfig &QReadIni::getIniConfig()
{
    return iniConfig;
}

 

写ini文件

#include <QtCore/QCoreApplication>  
#include <QSettings>  
int main(int argc, char *argv[])  
{  
   QCoreApplication a(argc, argv);  
   //Qt中使用QSettings类读写ini文件  
   //QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省  
   QSettings *configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat);  
   //向ini文件中写入内容,setValue函数的两个参数是键值对  
   //向ini文件的第一个节写入内容,ip节下的第一个参数  
   configIniWrite->setValue("/ip/first", "192.168.0.1");  
   //向ini文件的第一个节写入内容,ip节下的第二个参数  
   configIniWrite->setValue("ip/second", "127.0.0.1");  
   //向ini文件的第二个节写入内容,port节下的第一个参数  
   configIniWrite->setValue("port/open", "2222");  
   //写入完成后删除指针  
   delete configIniWrite;  
     
   return a.exec();  
}  

 

 

第二种JSON文件

{
    "conn": {
        "ip": "127.0.0.1",
        "port": "8080",
        "databaseversion": "QSQLITE",
        "databasename": "student",
        "username": "YYC",
        "password": "root"
    }
}

 

qreadjson.h文件内容如下

#ifndef QREADJSON_H
#define QREADJSON_H


#include <QString>
#include <QFile>
#include <QIODevice>
#include <QDomNodeList>
#include <QJsonDocument>
#include <QJsonObject>


#define JSONCONFIG  QReadJson::getInstance()->getJsonConfig()


typedef struct JsonConfig
{
    QString ip;                //IP地址
    QString port;              //端口
    QString dataBaseVersion;   //数据库版本
    QString dataBaseName;      //数据库名称
    QString userName;          //用户名
    QString passWord;          //密码
}JsonConfig;




class QReadJson
{
public:


    static QReadJson * getInstance();


    bool readJson();


    const JsonConfig &getJsonConfig();


private:
    QReadJson();


    static QReadJson * instance;


    JsonConfig jsonConfig;
};


#endif // QREADJSON_H

qreadjson.cpp内容如下:

#include"qreadjson.h"


QReadJson * QReadJson::instance = NULL;


QReadJson *QReadJson::getInstance()
{
    if(NULL == instance)
    {
        instance = new QReadJson();
    }


    return instance;
}


QReadJson::QReadJson()
{
    this->readJson();
}


bool QReadJson::readJson()
{
    QString strJson;


    QFile *file=new QFile("config.json");
    if(file->open(QIODevice::ReadOnly | QIODevice::Text))
    {
        strJson = file->readAll();
        file->close();
    }
    else
    {
        return false;
    }
    file->close();


    QJsonDocument jsonDom = QJsonDocument::fromJson(strJson.toUtf8());
    QJsonObject jsonObject = jsonDom.object();
    QJsonValue jsonValue = jsonObject.value(QString("conn"));




    QJsonObject objectItem = jsonValue.toObject();


    jsonConfig.ip = objectItem["ip"].toString();
    jsonConfig.port = objectItem["port"].toString();
    jsonConfig.dataBaseVersion = objectItem["databaseversion"].toString();
    jsonConfig.dataBaseName = objectItem["databasename"].toString();
    jsonConfig.userName = objectItem["username"].toString();
    jsonConfig.passWord = objectItem["password"].toString();


    delete file;
    return true;
}


const JsonConfig &QReadJson::getJsonConfig()
{
    return jsonConfig;
}

 

第三种是读取xml文件:

<?xml version="1.0" encoding="UTF-8"?>
-<data>-

<database>

<ip>127.0.0.1</ip>

<port>8080</port>

<databaseversion>QSQLITE</databaseversion>

<databasename>student.db</databasename>

<username>root</username>

<password>123</password>

</database>

</data>

qreadxml.h文件内容如下:

#ifndef QREADXML_H
#define QREADXML_H
#include<QString>
#include<QtXml>
#include<QFile>
#include<QIODevice>
#include<QDomNodeList>


#define XMLCONFIG  QReadXml::getInstance()->getXmlConfig()


typedef struct XmlConfig
{
    QString ip;                //IP地址
    QString port;              //端口
    QString dataBaseVersion;   //数据库版本
    QString dataBaseName;      //数据库名称
    QString userName;          //用户名
    QString passWord;          //密码
}XmlConfig;


class QReadXml
{
public:
    static QReadXml * getInstance();


    bool readXML();


    const XmlConfig &getXmlConfig();


private:
    QReadXml();


    XmlConfig xmlConfig;


    static QReadXml * instance;
};


#endif // QREADXML_H

qreadxml.cpp文件如下

#include "qreadxml.h"


QReadXml *QReadXml::instance = NULL;


QReadXml *QReadXml::getInstance()
{
    if(NULL == instance)
    {
        instance = new QReadXml();
    }


    return instance;
}


QReadXml::QReadXml()
{
    this->readXML();
}


bool QReadXml::readXML()
{
    int countData = 0;
    QDomDocument dom;
    QFile *file=new QFile("config.xml");
    if(file->open(QIODevice::ReadOnly))
    {
        if(!dom.setContent(file))  //将该xml文件导入到dom中
        {
            file->close();
            return false;
        }
    }
    else
    {
        return false;
    }
    file->close();
    QDomElement docElem = dom.documentElement();   //返回根元素


    QDomNode node = docElem.firstChild();          //返回根节点的第一个子节点


    while(!node.isNull())                        //如果节点不为空
    {
        if(node.isElement())                     //如果节点是元素
        {
            QDomElement element=node.toElement();//将其转化为元素


            QDomNodeList list=element.childNodes();//取出该元素的所有子节点放到list中


            //将子节点元素全部取出来
            for(int i = 0; i < list.count(); i ++)
            {
                QDomNode domNode = list.at(i);
                if(domNode.isElement())
                {
                    //取出我们所要的数据
                    switch(i)
                    {
                    case 0:xmlConfig.ip = domNode.toElement().text();break;
                    case 1:xmlConfig.port = domNode.toElement().text();break;
                    case 2:xmlConfig.dataBaseVersion = domNode.toElement().text();break;
                    case 3:xmlConfig.dataBaseName = domNode.toElement().text();break;
                    case 4:xmlConfig.userName = domNode.toElement().text();break;
                    case 5:xmlConfig.passWord = domNode.toElement().text();break;
                    }
                }
            }
        }


        countData++;
        node = node.nextSibling(); //下一个兄弟节点
    }


    return countData > 0 ? true : false;
}


const XmlConfig &QReadXml::getXmlConfig()
{
    return xmlConfig;
}

 

 

 

原文:

https://blog.csdn.net/yinyuchen1/article/details/75093895

https://www.cnblogs.com/mzy-google/p/5162107.html

https://blog.csdn.net/qq_33485434/article/details/80483883

posted @ 2019-07-07 12:37  狂奔~  阅读(6225)  评论(0编辑  收藏  举报