QT之INI、JSON、XML处理

文章目录

  • INI文件处理
    • 写配置文件
    • 读配置文件
  • JSON 文件处理
    • 写入JSON
    • 读取JSON
  • XML文件处理
    • 写XML文件
    • 读XML文件

INI文件处理

在这里插入图片描述

首先得引入QSettings
QSettings 是用来存储和读取应用程序设置的一个类

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

写配置文件

void WriteIniFiles() 
{//QSettings用来存储和读取应用程序设置的一个类// 直接使用QSettings类读写INI文件//只给出了文件名,像 "MySQLFiles.ini",那么配置文件会被存放在应用程序的工作目录下//从 Qt 5.15 版本开始,QSettings 默认采用 UTF-8 编码QSettings *ConfigWriteIniFiles=new QSettings("MySQLFiles.ini",QSettings::IniFormat);
/*
QSettings::IniFormat 指定配置文件使用 INI 格式存储。
INI 格式是一种文本格式,由节 (sections) 和键值对 (key-value pairs) 组成,
便于人类阅读和编辑。这种格式在 Windows 系统中传统上用于存储应用程序设置,现在也被广泛用于跨平台应用。
*/// 向INI文件当中写入数据信息// 第一节的第一参数,后面就依次类推ConfigWriteIniFiles->setValue("/database/ip","192.168.12.189");ConfigWriteIniFiles->setValue("/database/port","3308");ConfigWriteIniFiles->setValue("/database/user","root");ConfigWriteIniFiles->setValue("database/password","123456");//写到文件中的格式
/*
[database]
ip=192.168.12.189
port=3308
user=root
password=123456
*/ConfigWriteIniFiles->setValue("/notice/version","5.6");ConfigWriteIniFiles->setValue("/notice/datetime","2022-10-25 16:27:23");
/*
[notice]
version=5.6
datetime=2022-10-25 16:27:23
*///获取MySQLFiles.ini文件路径qDebug() << ConfigWriteIniFiles->fileName();// 向IN文件写入完成之后,删除指针delete ConfigWriteIniFiles;
}

读配置文件

void ReadIniFiles() 
{QSettings *ConfigReadIniFiles=new QSettings("MySQLFiles.ini",QSettings::IniFormat);//QSettings->value("....") 返回的是一个 QVariant 对象,而不是直接的字符串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();/*QString::toUtf8()将字符串转换为UTF-8编码的QByteArray,其.data()返回的char*是合法的UTF-8字节流,与终端编码匹配(假设终端支持UTF-8)。*/qDebug()<<"正确--------";qDebug()<<"读取INI配置文件参数选项如下:";qDebug()<<"MySQL数据库IP地址:"<<strip.toUtf8().data();qDebug()<<"数据库端口:"<<strport.toUtf8().data();qDebug()<<"数据库用户:"<<struser.toUtf8().data();qDebug()<<"数据库密码:"<<strpassword.toUtf8().data();qDebug()<<"数据库版本:"<<strversion.toUtf8().data();qDebug()<<"数据库日期:"<<strdatetime.toUtf8().data();/*QString::data()返回的是QChar*(指向UTF-16数据的指针),直接转换为char*时,每个QChar(16位)会被拆分为两个char(8位),导致字节顺序和编码混乱。*/qDebug()<<"错误--------";qDebug()<<"读取INI配置文件参数选项如下:";qDebug()<<"MySQL数据库IP地址:"<<strip.data();qDebug()<<"数据库端口:"<<strport.data();qDebug()<<"数据库用户:"<<struser.data();qDebug()<<"数据库密码:"<<strpassword.data();qDebug()<<"数据库版本:"<<strversion.data();qDebug()<<"数据库日期:"<<strdatetime.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 文件处理

在这里插入图片描述

头文件引入

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

写入JSON

// 将数据信息-->写入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数据库配置参数");// 将json对象作为Json对象插入的数据值jsonifo.insert("data",mysqinfo); // 2: 创建JSON文档//QJsonDocument 用于将 Qt 的数据结构序列化为 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数据文件写入成功!");}

在这里插入图片描述

读取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解析错误的时候,报告错误信息//把 JSON 格式的文本解析成 Qt 能够处理的数据结构QJsonDocument jsondoc=QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);if(!jsondoc.isEmpty() && (jsonerror.error==QJsonParseError::NoError)){// 只要jsondoc不为空,和jsonerror没有错误// 将它转换为JSON对象QJsonObject json=jsondoc.object();QJsonValue code=json.value("code");QJsonValue data=json.value("data");// QJsonValue .isUndefined()
//用于检查 QJsonValue 对象是否为未定义状态的方法。在 JSON 处理中,未定义状态不同于空值(null),它表示该 JSON 值从未被显式设置过。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");//判断 data JSON 值是否未定义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文件处理

在这里插入图片描述

引入头文件

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

写XML文件

ReadWriteXml::ReadWriteXml(QWidget *parent): QDialog(parent), ui(new Ui::ReadWriteXml)
{ui->setupUi(this);//QStringstrcurrentfilepath="d:/xmlfiles"; // xml文件路径strcurrentfilename="/factoryworkersxml.xml";
}bool ReadWriteXml::openxmlfiles(QString filenamepath) // 打开指定文件
{// 如果没有,则创建文件m_qfiles.setFileName(strcurrentfilepath+filenamepath);return m_qfiles.open(QIODevice::ReadWrite | QFile::Text);
}void ReadWriteXml::writexmlfiles()   // 写入xml文件
{if(!openxmlfiles(strcurrentfilename)){qDebug()<<"写入:打开XML文件失败,请重新检查?";return;}qDebug()<<"写入:打开XML文件成功,请认真操作xml!";//Qt 框架里用于处理 XML 文档的类,它以 DOM(文档对象模型)方式呈现 XML 文档QDomDocument domdoct; // 创建对象//QDomProcessingInstruction 是 Qt 框架中用于处理 XML 处理指令QDomProcessingInstruction version; // 写入xml头部(添加处理命令)version=domdoct.createProcessingInstruction("xml","version = \"1.0\" encoding = \"GB2312\"");domdoct.appendChild(version);// 添加第1个子节点及相关子元素QDomElement domrootelement=domdoct.createElement("factory"); // 创建顶层节点domdoct.appendChild(domrootelement);QDomElement itemrootelement=domdoct.createElement("worker"); // 创建父节点{// 创建子元素QDomElement node1=domdoct.createElement("WNo"); // 创建子节点(创建元素节点)QDomText domtext1=domdoct.createTextNode("WNo"); // 可创建文本节点domtext1.setData(ui->lineEdit_No->text()); // 设置子节点数据node1.appendChild(domtext1); // 将子节点数据进行绑定itemrootelement.appendChild(node1); // 将子节点绑定到父亲节点QDomElement node2=domdoct.createElement("WName"); // 创建子节点(创建元素节点)QDomText domtext2=domdoct.createTextNode("WName"); // 可创建文本节点domtext2.setData(ui->lineEdit_Name->text()); // 设置子节点数据node2.appendChild(domtext2); // 将子节点数据进行绑定itemrootelement.appendChild(node2); // 将子节点绑定到父亲节点QDomElement node3=domdoct.createElement("WSex"); // 创建子节点(创建元素节点)QDomText domtext3=domdoct.createTextNode("WSex"); // 可创建文本节点domtext3.setData(ui->lineEdit_Sex->text()); // 设置子节点数据node3.appendChild(domtext3); // 将子节点数据进行绑定itemrootelement.appendChild(node3); // 将子节点绑定到父亲节点QDomElement node4=domdoct.createElement("WEducation"); // 创建子节点(创建元素节点)QDomText domtext4=domdoct.createTextNode("WEducation"); // 可创建文本节点domtext4.setData(ui->lineEdit_Education->text()); // 设置子节点数据node4.appendChild(domtext4); // 将子节点数据进行绑定itemrootelement.appendChild(node4); // 将子节点绑定到父亲节点QDomElement node5=domdoct.createElement("WDepartment"); // 创建子节点(创建元素节点)QDomText domtext5=domdoct.createTextNode("WDepartment"); // 可创建文本节点domtext5.setData(ui->lineEdit_Department->text()); // 设置子节点数据node5.appendChild(domtext5); // 将子节点数据进行绑定itemrootelement.appendChild(node5); // 将子节点绑定到父亲节点QDomElement node6=domdoct.createElement("WSalary"); // 创建子节点(创建元素节点)QDomText domtext6=domdoct.createTextNode("WSalary"); // 可创建文本节点domtext6.setData(ui->lineEdit_Salary->text()); // 设置子节点数据node6.appendChild(domtext6); // 将子节点数据进行绑定itemrootelement.appendChild(node6); // 将子节点绑定到父亲节点}domrootelement.appendChild(itemrootelement); // 绑定到顶层节点m_qfiles.write(domdoct.toString().toLocal8Bit().data());m_qfiles.close();QMessageBox::information(this,"提示","恭喜你,写入XML文件数据成功,请查看目录文件?",QMessageBox::Yes);
}

在这里插入图片描述

读XML文件

void ReadWriteXml::readxmlfiles()    // 读取xml文件
{if(!openxmlfiles(strcurrentfilename)){qDebug()<<"读取:打开XML文件失败,请重新检查?";return;}qDebug()<<"读取:打开XML文件成功,请认真操作xml!";QDomDocument docs;//于解析 XML 数据并将其设置为 DOM(文档对象模型)树的方法//QDomDocument::setContent() 函数在解析 XML 时会自动跳过 XML 处理指令 ( 以 <? 开头、?> )//<?xml version = "1.0" encoding = "GB2312"?>if(!docs.setContent(&m_qfiles)){m_qfiles.close();qDebug()<<"读取:操作setContent失败,请重新检查?";return;}qDebug()<<"读取:操作setContent成功,请认真操作!";// 读取根节点QDomElement root=docs.documentElement();// 读取第1个父亲节点QDomNode node=root.firstChild();while(!node.isNull()){QDomNodeList sonlist=node.childNodes(); // 读取子结点集合信息QString rootname=node.toElement().tagName(); // 读取父亲节点名称if(rootname.compare("worker")==0){// 将子节点集合信息传递到读取子节点数据readrootxml(sonlist);}node=node.nextSibling(); // 读取下一个父节点}}void ReadWriteXml::readrootxml(QDomNodeList sonnodelist) // 读取子节点数据
{for(int sonnode=0;sonnode<sonnodelist.size();sonnode++){// 获取子节点QDomElement sonelement=sonnodelist.at(sonnode).toElement();if(sonelement.toElement().tagName().compare("WNo")==0) // 取出子节点进行比较{ui->lineEdit_No_R->setText(sonelement.text());}else if(sonelement.toElement().tagName().compare("WName")==0){ui->lineEdit_Name_R->setText(sonelement.text());}else if(sonelement.toElement().tagName().compare("WSex")==0){ui->lineEdit_Sex_R->setText(sonelement.text());}else if(sonelement.toElement().tagName().compare("WEducation")==0){ui->lineEdit_Education_R->setText(sonelement.text());}else if(sonelement.toElement().tagName().compare("WDepartment")==0){ui->lineEdit_Department_R->setText(sonelement.text());}else if(sonelement.toElement().tagName().compare("WSalary")==0){ui->lineEdit_Salary_R->setText(sonelement.text());}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

道德经总结

道德经 《道德经》是中国古代伟大哲学家老子所著&#xff0c;全书约五千字&#xff0c;共81章&#xff0c;分为“道经”&#xff08;1–37章&#xff09;和“德经”&#xff08;38–81章&#xff09;两部分。 《道德经》是一部融合哲学、政治、人生智慧于一体的经典著作。它提…

行为型:迭代器模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 1、核心思想 目的&#xff1a;将遍历逻辑与数据存储结构解耦 概念&#xff1a;提供一种机制来按顺序访问集合中的各元素&#xff0c;而不需要知道集合内部的构造 举例&#xff1a;…

人脸识别技术合规备案最新政策详解

《人脸识别技术应用安全管理办法》将于2025年6月1日正式实施&#xff0c;该办法从技术应用、个人信息保护、技术替代、监管体系四方面构建了人脸识别技术的治理框架&#xff0c;旨在平衡技术发展与安全风险。 一、明确技术应用的边界 公共场所使用限制&#xff1a;仅在“维护公…

如何把vue项目部署在nginx上

1&#xff1a;在vscode中把vue项目打包会出现dist文件夹 按照图示内容即可把vue项目部署在nginx上

奇好 PDF安全加密 + 自由拆分合并批量处理 OCR 识别

各位办公小能手们&#xff0c;你们好呀&#xff01;今天我要给大家介绍一款超厉害的软件——奇好PDF。它就像是一个PDF文档处理的超级大管家&#xff0c;啥功能都有&#xff0c;格式转换、编辑、提取、安全保护这些统统不在话下&#xff0c;不管是办公、学习&#xff0c;还是设…

Docker-Harbor 私有镜像仓库使用指南

1.用户管理 为项目创建专用用户&#xff0c;并配置权限&#xff0c;确保该用户能够顺利推送镜像到 Harbor 仓库&#xff0c;确保镜像推送操作的安全性和便捷性。 创建完成后可以根据需要选择是否设置为管理员 角色 权限描述 适用场景 系统管理员 拥有系统的完全控制权限 运维…

HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)

1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网&#xff08;State Grid Corporation of China&#xff0c;简称 SGCC&#xff09;的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用&#xff0c;用户可以实时追踪家庭用电量情况&…

maven 3.0多线程编译提高编译速度

mvn package 默认只使用 单线程 来执行构建生命周期&#xff08;即顺序地构建每一个模块&#xff09;。 如果你使用的是多模块项目&#xff0c;Maven 从 3.0 开始提供了**并行构建&#xff08;parallel build&#xff09;**的能力&#xff0c;但它不是默认开启的。 如何启用多…

python模块管理环境变量

概要 在 Python 应用中&#xff0c;为了将配置信息与代码分离、增强安全性并支持多环境&#xff08;开发、测试、生产&#xff09;运行&#xff0c;使用专门的模块来管理环境变量是最佳实践。常见工具包括&#xff1a; 标准库 os.environ&#xff1a;直接读取操作系统环境变量…

K8s 集群运行时:从 Docker 升级到 Containerd

一、背景&#xff1a;Kubernetes容器运行时演进史 自2020年Kubernetes 1.20版本宣布弃用Docker作为默认容器运行时以来&#xff0c;容器技术生态经历了重大变革。作为CNCF毕业项目&#xff0c;Containerd凭借其轻量化架构、原生CRI支持和卓越性能表现&#xff0c;逐渐成为云原生…

30-消息队列

一、消息队列概述 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、 中断和任务间传递信息&#xff0c;实现了任务接收来自其他任务或中断的不固定长度的消息&#xff0c;任务能够从队列里面读取消息&#xff0c;当队列中的…

AI Agent开发第74课-解构AI伪需求的魔幻现实主义

开篇 🚀在之前的系列中我们狂炫了AI Agent的各种高端操作(向量数据库联动、多模态感知、动态工作流等…),仿佛每个程序员都能用LLM魔法点石成金✨。 但今天咱们要泼一盆透心凉的冷水——当企业把AI当成万能胶水强行粘合所有需求时,连电风扇都能被玩出量子纠缠的魔幻现实…

低代码AI开发新趋势:Dify平台化开发实战

在人工智能快速发展的今天&#xff0c;AI应用的开发方式也在不断演变。从传统的手写代码到如今的低代码甚至零代码开发&#xff0c;技术的进步让更多的非专业开发者也能轻松上手。本文将带你走进Dify平台化开发的世界&#xff0c;探索如何通过这一强大的低代码AI开发平台&#…

开发积累总结

export default 和export const 均用于从模块导出函数、对象或原始值&#xff0c;区别在于&#xff1a; export default&#xff1a;一个文件中只能有一个&#xff0c;为默认导出&#xff0c;在引用时指定名字。 export const&#xff1a;一个文件中有多个&#xff0c;为命名…

【TCP/IP协议族详解】

目录 第1层 链路/网络接口层—帧&#xff08;Frame&#xff09; 1. 链路层功能 2. 常见协议 2.1. ARP&#xff08;地址解析协议&#xff09; 3. 常见设备 第2层 网络层—数据包&#xff08;Packet&#xff09; 1. 网络层功能 2. 常见协议 2.1. ICMP&#xff08;互联网…

vocabulary in program

编号意思&#xff08;英译中&#xff09;音标单词1n. 稀薄&#xff1b;稀罕&#xff1b;珍奇/ˈreərɪsn/rareness2n.登记表&#xff0c;注册簿&#xff1b;注册员&#xff1b;&#xff08;人或乐器的&#xff09;声区&#xff0c;音区&#xff1b;&#xff08;适合特定场合使…

整平机技术进阶:从原理到实战的深度解析

一、整平机的力学原理与数学模型 整平机的核心在于通过材料塑性变形消除内应力&#xff0c;其力学过程可简化为以下模型&#xff1a; 弹塑性变形理论 当材料通过辊轮时&#xff0c;表层受拉应力&#xff0c;芯部受压应力&#xff0c;超过屈服强度后产生永久变形。 关键公式&a…

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter1 初识小程序 - 3项目目录结构4快速上手

3 项目目录结构 3.1 项目目录结构 3.1.1 目录介绍 # 1 项目主配置文件&#xff0c;在项目根路径下&#xff0c;控制整个项目的-app.js # 小程序入口文件&#xff0c;小程序启动&#xff0c;会执行此js-app.json # 小程序全局配置文件&#xff0c;配置小程序导航栏颜色等信息…

427. 建立四叉树

https://leetcode.cn/problems/construct-quad-tree/description/?envTypestudy-plan-v2&envIdtop-interview-150思路&#xff1a;这题乍一看很复杂但是只要读懂题找到规律就会发现其实很简单 四叉树的构造规律&#xff1a; 1. 如果一个区域的值全相等&#xff0c;那么这个…

IDEA中创建SpringBoot项目没有Java8

IDEA中创建SpringBoot项目没有Java8 文章目录 IDEA中创建SpringBoot项目没有Java8一&#xff1a;解决办法 很久没单独创建springboot项目,今天使用idea的Spring Initializr 创建 Spring Boot项目时,发现java版本里,无法选择jdk1.8,只有17、21、22,所以本文介绍了使用Spring Ini…