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

原文地址:https://www.cnblogs.com/xiangtingshen/p/11145974.html

时间: 2024-10-06 12:31:53

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

Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)

QT通过三种形式提供了对线程的支持.它们分别是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中,在构建库时有不选择线程支持的选项,从4.0开始,线程总是有效的. 线程类 Qt 包含下面一些线程相关的类: QThread 提供了开始一个新线程的方法 QThreadStorage 提供逐线程数据存储

【Qt 】QSettings写ini配置文件

QSettings写ini配置文件(Qt版本5.2): #include "inidemo.h" #include <QSettings> #include <QTextCodec> IniDemo::IniDemo(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); QSettings settings("setting.ini",QSettings::IniFormat);

三种网络数据传输方式比较(byte stream,protobuf,json)

三种网络数据传输方式比较(byte stream,protobuf,json) 2014-08-27 10:39:04 分类: LINUX 原文地址:三种网络数据传输方式比较(byte stream,protobuf,json) 作者:yuyunliuhen 针对于tinynet进行了三种数据传输方式的测试,包括最初的byte stream,protobuf,以及比较流行json方式.跟之前的几次测试一样,模型为echo模型,都是以epoll为例,每个连接每秒发送10个包,每个数据包约100by

Qt中三种解析xml的方式

在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码.虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面三种解析xml采用相同的原理,所以就算你不是学习qt,也可以大致参看一下代码,对三种解析方式有一种大致的感觉. 先给出xml如下: <?xml version="1.0" encoding="utf-8"?> <school> <teach

部署webapp到web容器的三种方式(这里的web容器Tomcat)

*******************************这是看传智播客的学习视频学到的*********************************** 0.首先看看我们的例子** 1.第一种方式: 直接将项目放到webapps目录下即可.   * /hello:项目的访问路径-->虚拟目录 * 简化部署:将项目打成一个war包,再将war包放置到webapps目录下. * war包会自动解压缩 1.1直接把webapp的文件夹复制 1.2把webapp的war包放下面 1.3运行结果

【Android高级】XMl文件的DOM、SAX、PULL三种解析方式全解

本来一直忙着期末考试的复习,但复习挺无聊的,偶然看到xml的解析方法,虽然以前做过,但感觉不是很熟悉了,所以抽点时间一口气把三种方式都复习了遍.这三种方法中DOM最耗内存,因为它是把整个文件加载进去然后进行分类整理的,PULL和SAX类似,只是SAX要用到一个解析类,类中的主要三个方法完成内容的解析,而PULL方法是Android特有的,根据获得的标签判断并解析,这也是安卓中最常使用的方法. 接下来给大家复习下,因为我觉得看代码更容易明白,讲解的就不多了. 首先我们准备好我们要解析的资源文件和封

转 Velocity中加载vm文件的三种方式

Velocity中加载vm文件的三种方式 velocitypropertiespath Velocity中加载vm文件的三种方式:   方式一:加载classpath目录下的vm文件 Properties p = new Properties(); p.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); Ve

tomcat 三种部署方式以及server.xml文件的几个属性详解

一.直接将web项目文件件拷贝到webapps目录中 这是最常用的方式,Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.如果你想要修改这个默认目录,可以在conf下的server.xml文件里修改Host标签里的appBase值. 这个方法实际上和在IDE开发环境里部署项目是一样的. 用此方法的访问路径为http://localhost:8080/webname 二.修改Server.xml文件 在conf下的server.xml文件里找

Linux下快速清空文件内容的三种方法

Linux下快速清空文件内容的三种方法在Linux环境中,我们如果想快速清空一个文件或者log的内容: 1.#echo "" > test.txt(文件大小被截为1字节) 2.# > test.txt(文件大小被截为0字节) 3.#cat /dev/null > /home/test.txt(文件大小被截为0字节)————————————————版权声明:本文为CSDN博主「贾维斯博客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声