Qt学习笔记#第十章:INI、JSON、XML文件操作

一、INI文件概述

        .ini文件时Initialization File的缩写,即初始化文件,是Windows的系统配置文件所采用的存储格式。文件扩展名:配置名称.ini  。比如项目中的配置文件是整个项目共用的,假设数据路配置.ini

        1.INI 文件由节、键、值由三部分组成:#include<QSettings>

        节[section]

        (键=值)name=value;   

例如:

[sectionname]
Keynames=values

常用的API

QSettings 是 Qt 框架中用于读取和写入应用程序设置的类。它提供了一种简单的方式来保存和检索应用程序的配置信息,如窗口位置、用户首选项、历史记录等。

QSettings 类的一些常用方法和属性:

构造函数:

QSettings():使用默认的构造函数创建一个 QSettings 对象,读取系统的全局设置。
QSettings(const QString& organization, const QString& application):根据组织和应用程序名称

创建一个 QSettings 对象,读取应用程序的设置。
设置值:
setValue(const QString& key, const QVariant& value):设置指定键的值。
beginGroup(const QString& prefix):开始一个组,可以在值名称前加上组名称以进行分组。
endGroup():结束当前组。

获取值:
value(const QString& key, const QVariant& defaultValue = QVariant()):获取指定键的值,如果键不存在,则返回默认值。
contains(const QString& key):检查指定键是否存在。
childKeys():获取当前组下所有键的列表。
childGroups():获取当前组下所有子组的列表。

删除值:
remove(const QString& key):从设置中删除指定键及其对应的值。
remove(const QString& key):删除当前组及其下的所有键和值。

设置文件路径:
setPath(QSettings::Format format, QSettings::Scope scope, const QString& path):设置设置文件的格式、范围和路径。默认情况下,设置文件存储在操作系统的特定位置。

静态函数:
QSettings::defaultFormat():获取默认设置文件格式。
QSettings::setDefaultFormat(QSettings::Format format):设置默认设置文件格式。
注意:QSettings 会根据不同平台(Windows、Linux、macOS 等)以及应用程序的组织和名称自动选择存储路径。

代码demo

#include "wrinifile.h"
#include <QSettings>
#include <QtDebug>

void WriteIniFiles() // 写配置文件
{
    // 直接使用QSettings类读写INI文件  第二个参数是设置文件的格式。这里指定为 QSettings::IniFormat,表示使用 INI 格式。
    QSettings *ConfigWriteIniFiles=new QSettings("Files.ini",QSettings::IniFormat);

    // 向INI文件当中写入数据信息
    // 第一节的第一参数,后面就依次类推
    ConfigWriteIniFiles->setValue("/database/ip","192.168.12.1");
    ConfigWriteIniFiles->setValue("/database/port","3306");
    ConfigWriteIniFiles->setValue("/database/user","root");
    ConfigWriteIniFiles->setValue("database/password","123456");
    //第二节
    ConfigWriteIniFiles->setValue("/notice/version","5.6");
    ConfigWriteIniFiles->setValue("/notice/datetime","2022-10-25 16:27:23");

    // 向IN文件写入完成之后,删除指针
    delete ConfigWriteIniFiles;
}

void ReadIniFiles() // 读配置文件
{
    QSettings *ConfigReadIniFiles=new QSettings("MySQLFiles.ini",QSettings::IniFormat);

    QString strip=ConfigReadIniFiles->value("/database/ip").toString();
    QString strport=ConfigReadIniFiles->value("/database/port/").toString();
    QString struser=ConfigReadIniFiles->value("/database/user").toString();
    QString strpassword=ConfigReadIniFiles->value("/database/password").toString();
    QString strversion=ConfigReadIniFiles->value("/notice/version").toString();
    QString strdatetime=ConfigReadIniFiles->value("/notice/datetime").toString();

    // 输出读取配置文件的参数信息
    qDebug()<<"读取INI配置文件参数选项如下:";
    qDebug()<<"IP地址:"<<strip.toUtf8().data();
    qDebug()<<"端口:"<<strport.toUtf8().data();
    qDebug()<<"用户:"<<struser.toUtf8().data();
    qDebug()<<"密码:"<<strpassword.toUtf8().data();
    qDebug()<<"版本:"<<strversion.toUtf8().data();
    qDebug()<<"日期:"<<strdatetime.toUtf8().data();


    // 将读取配置文件完成之后,删除指针
    delete ConfigReadIniFiles;
}


void ReadIniFilesIsKey()
{
    QSettings setting("./MySQLFiles.ini",QSettings::IniFormat);

    foreach(QString key,setting.allKeys())
    {
        qDebug()<<key.toUtf8().data()<<":"<<setting.value(key).toString().toUtf8().data();
    }
}

二、JSON 文件格式

JSON使用场景:配置文件、序列化、定义接口等等

JSON是存储和交换文本信息的语法类似XML,它比XML更小、更快、更加容易解析

#include <QFile> // 文件读写\\\\\\#include <QJsonDocument> // JSON文档\\\\\#include <QJsonObject> // JSON对象\\\\\\#include <QJsonParseError> // JSON异常捕捉

写入流程:创建JSON对象、 创建JSON文档(加载json对象)、创建文件写入

读出流程:创建QJsonDocument 加载字符串,然后将它转化为QJsonObject对象

#include "qjsonoper.h"
#include "ui_qjsonoper.h"

#include <QMessageBox>
#include <QDebug>
#include <QFile> // 文件读写
#include <QJsonDocument> // JSON文档
#include <QJsonObject> // JSON对象
#include <QJsonParseError> // JSON异常捕捉

QJsonOper::QJsonOper(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::QJsonOper)
{
    ui->setupUi(this);
}

QJsonOper::~QJsonOper()
{
    delete ui;
}

// 将数据信息-->写入JSON文件
void QJsonOper::on_pushButtonWriteJson_clicked()
{
    // 1:创建json对象
    QJsonObject mysqinfo;

    mysqinfo.insert("ip","192.168.0.125");
    mysqinfo.insert("port",3308);
    mysqinfo.insert("user","root");
    mysqinfo.insert("password","123456");

    QJsonObject jsonifo;
    jsonifo.insert("code",1);
    jsonifo.insert("dbmsg","MySQL数据库配置参数");
    jsonifo.insert("data",mysqinfo); // 将json对象作为Json对象插入的数据值

    // 2: 创建JSON文档
    QJsonDocument jsondoc;
    jsondoc.setObject(jsonifo);

    // 3: 创建文件
    QFile qfiles("./databasejsonfiles.json");
    if(qfiles.open(QIODevice::WriteOnly))
    {
        qfiles.write(jsondoc.toJson());
        qfiles.close();
        qDebug()<<"恭喜你,json数据文件写入成功!";
    }
    QMessageBox::information(this,"写入成功","恭喜你,json数据文件写入成功!");

}

void QJsonOper::on_pushButtonReadJson_clicked()
{
    QString strjson;

    QString strmsg;

    QFile qfiles("./databasejsonfiles.json");
    if(qfiles.open(QIODevice::ReadOnly))
    {
        strjson=qfiles.readAll();
        qfiles.close();
    }

    QJsonParseError jsonerror; // 返回JSON解析错误的时候,报告错误信息
    QJsonDocument jsondoc=QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);

    QString strtemp;
    if(!jsondoc.isEmpty() && (jsonerror.error==QJsonParseError::NoError))
    {
        // 只要jsondoc不为空,和jsonerror没有错误
        // 将它转换为JSON对象
        QJsonObject json=jsondoc.object();
        QJsonValue code=json.value("code");
        QJsonValue data=json.value("data");

        // 检查数据
        if(code.isUndefined() || code.toDouble()!=1 || data.isUndefined() || !data.isObject())
        {
            qDebug()<<"转换JSON数据错误,请重新检查?";
            QMessageBox::critical(this,"错误","转换JSON数据错误,请重新检查?");
            exit(100);
        }

        // 如果没有错误,读取data数据信息
        QJsonObject databaseinfo=data.toObject();

        QJsonValue dbip=databaseinfo.value("ip");
        QJsonValue dbport=databaseinfo.value("port");
        QJsonValue dbuser=databaseinfo.value("user");
        QJsonValue dbpassword=databaseinfo.value("password");

        // 检查接口是否正确
        if(dbip.isUndefined()||
                dbport.isUndefined()||
                dbuser.isUndefined()||
                dbpassword.isUndefined())
        {
            qDebug()<<"接口错误,请重新检查?";
            QMessageBox::critical(this,"错误","接口错误,请重新检查?");
            exit(100);
        }

        QString strip=dbip.toString();
        int iport=dbport.toInt();
        QString struser=dbuser.toString();
        QString strpassword=dbpassword.toString();

        // 判断每一项配置是否为空
        if(strip.isEmpty() || struser.isEmpty() || strpassword.isEmpty())
        {
            qDebug()<<"此数据项不能为空,请重新检查?";
            QMessageBox::critical(this,"错误","此数据项不能为空,请重新检查?");
            exit(100);
        }

        qDebug()<<"数据库IP地址:"<<strip;
        qDebug()<<"数据库端口:"<<iport;
        qDebug()<<"数据库用户:"<<struser;
        qDebug()<<"数据库密码:"<<strpassword;

        // 拼接字符串
        strmsg+="【JSON配置参数】";
        strmsg+="\n数据库IP地址:"+strip;
        strmsg+="\n数据库端口:"+QString::number(iport,10);
        strmsg+="\n数据库用户:"+struser;
        strmsg+="\n数据库密码:"+strpassword;

    }
    QMessageBox::information(this,"成功",strmsg,QMessageBox::Yes);
}

三、XML 语言

        可扩展标记语言(Extensible Markup Language,XML),标准通用语言子集,可以用来标记数据、定义数据、是一种允许用户对自己的标记语言进行定义的源语言。

#include <QDomComment>// QDomComment是Qt所封装的类,专门用来操作XML文件(项目中用来存储一些配置数据信息)

.h

#ifndef READWRITEXML_H
#define READWRITEXML_H

#include <QDialog>

#include <QDir>
#include <QFile>         //写入文件
#include <QXmlStreamReader> //读xml
#include <QXmlStreamWriter> //写xml
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class ReadWriteXml; }
QT_END_NAMESPACE

class ReadWriteXml : public QDialog
{
    Q_OBJECT

public:
    ReadWriteXml(QWidget *parent = nullptr);
    ~ReadWriteXml();

private:
    Ui::ReadWriteXml *ui;

    QFile  m_qfile;
    QString strcurrentfilepath; //当前文件路径
    QString strcurrentfilename; //当前文件名

public:
    bool openXMLFile(const QString&);  //打开指定文件
    void readXMLFile(QFile&,const QString&);  //读取指定文件
    void writeXMLFile(QFile&,const QString&); //写入xml文件

private slots:
    void on_pushButton_write_clicked();
    void on_pushButton_read_clicked();
};
#endif // READWRITEXML_H

.cpp

#include "readwritexml.h"
#include "ui_readwritexml.h"

ReadWriteXml::ReadWriteXml(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::ReadWriteXml)
{
    ui->setupUi(this);

    QDir dir;
    strcurrentfilepath = "e:/xmlfiles";  //xml路径
    strcurrentfilename = "/factoryworker.xml";//文件名
}

ReadWriteXml::~ReadWriteXml()
{
    delete ui;
}

bool ReadWriteXml::openXMLFile(const QString &filename)
{
    //如果没有则创建文件
    m_qfile.setFileName(strcurrentfilepath + filename);
    return m_qfile.open(QIODevice::ReadWrite|QIODevice::Text);
}

void ReadWriteXml::readXMLFile(QFile& file,const QString &fileName)
{
    if(!openXMLFile(fileName))
    {
        qDebug()<<"打开xml文件读取失败,请重新检查";
        return;
    }
    qDebug()<<"打开xml文件读取成功";

    QXmlStreamReader xmlread(&file);

    // 逐行读取 XML 文件内容
    /*
     * xmlread.atEnd():如果读取器读取到XML文档的末尾,或者发生错误()并中止读取,则返回true。否则,返回false。
     * xmlread.hasError():检查是否存在错误;如果发生错误返回true,否则返回false。
     * readNext():读取下一个XML令牌,返回QXmlStreamReader::TokenType以指示令牌的类型。
    */
    // QString parentElement;
    while (!xmlread.atEnd() && !xmlread.hasError()) {
        // 读取下一个XML令牌
        QXmlStreamReader::TokenType token = xmlread.readNext();
        qDebug()<<token;
        // 在此处处理 XML 内容,例如读取元素、属性和文本
        if(token == QXmlStreamReader::StartElement)// 开始元素标签
        {
            /*
             * name()返回StartElement、EndElement或EntityReference的本地名称。
             * readElementText()读取到对应的EndElement并返回中间的所有文本。
            */
            QString elementName = xmlread.name().toString();
            // 设置父节点
            // parentElement = elementName;
            //QString text = xmlread.readElementText(); // 读取元素的文本内容
            qDebug()<<elementName;

            if(elementName =="WNo")
            {
                ui->lineEdit_7->setText(xmlread.readElementText());
            }
            else if(elementName == "WName")
            {
                ui->lineEdit_8->setText(xmlread.readElementText());
            }
            else if(elementName == "WSex")
            {
                ui->lineEdit_9->setText(xmlread.readElementText());
            }
            else if(elementName == "WEducation")
            {
                ui->lineEdit_10->setText(xmlread.readElementText());
            }
            else if(elementName == "WDepartment")
            {
                ui->lineEdit_11->setText(xmlread.readElementText());
            }
            else if(elementName == "WSalary")
            {
                ui->lineEdit_12->setText(xmlread.readElementText());
            }
        }
    }
    // 检查是否有错误发生
    if (xmlread.hasError())
    {
        qDebug() << "解析XML时发生错误: " << xmlread.errorString();
        return;
    }
    file.close();
}

void ReadWriteXml::writeXMLFile(QFile &file,const QString &fileName)
{
    if(!openXMLFile(fileName))
    {
        qDebug()<<"打开xml文件写入失败,请重新检查";
        return;
    }
    qDebug()<<"打开xml文件写入成功,请重新检查";

    QXmlStreamWriter xmlwrite(&file);
    //如果enable为真,则启用自动格式化,否则禁用它。默认值为false。
    xmlwrite.setAutoFormatting(true);

    // 写入 XML 文件内容
    xmlwrite.writeStartDocument();//写入以XML版本号version开头的文档。
    // 写入根元素
    xmlwrite.writeStartElement("factory");

    // 在此处添加更多的元素、属性和文本
    xmlwrite.writeStartElement("worker");
    //xmlwrite.writeAttribute("id","1");  //父节点的标识id=1
    //xmlwrite.writeTextElement("name","lixin");
    //xmlwrite.writeTextElement("sex","男");
    {
        //创建子节点
        xmlwrite.writeStartElement("WNo");//写入一个起始元素标签。
        xmlwrite.writeCharacters(ui->lineEdit->text());//写入文本内容。
        xmlwrite.writeEndElement();//写入一个结束元素标签。

        xmlwrite.writeStartElement("WName");//写入一个起始元素标签。
        xmlwrite.writeCharacters(ui->lineEdit_2->text());//写入文本内容。
        xmlwrite.writeEndElement();//写入一个结束元素标签。

        xmlwrite.writeStartElement("WSex");//写入一个起始元素标签。
        xmlwrite.writeCharacters(ui->lineEdit_3->text());//写入文本内容。
        xmlwrite.writeEndElement();//写入一个结束元素标签。

        xmlwrite.writeStartElement("WEducation");//写入一个起始元素标签。
        xmlwrite.writeCharacters(ui->lineEdit_4->text());//写入文本内容。
        xmlwrite.writeEndElement();//写入一个结束元素标签。

        xmlwrite.writeStartElement("WDepartment");//写入一个起始元素标签。
        xmlwrite.writeCharacters(ui->lineEdit_5->text());//写入文本内容。
        xmlwrite.writeEndElement();//写入一个结束元素标签。

        xmlwrite.writeStartElement("WSalary");//写入一个起始元素标签。
        xmlwrite.writeCharacters(ui->lineEdit_6->text());//写入文本内容。
        xmlwrite.writeEndElement();//写入一个结束元素标签。
    }
    // 关闭父节点
    xmlwrite.writeEndElement();//关闭前一个开始元素
    // 关闭根节点
    xmlwrite.writeEndDocument();

    file.close();
}

void ReadWriteXml::on_pushButton_write_clicked()
{
    writeXMLFile(m_qfile,strcurrentfilename);
}

void ReadWriteXml::on_pushButton_read_clicked()
{
    readXMLFile(m_qfile,strcurrentfilename);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值