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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82291.shtml
英文地址,請注明出處:http://en.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…