使用QT讀取文件,生成json文件

前言:

  • 最近我遇到了一個需要讀取本地文件生成json文件的問題,在這里分享下如何在qt中寫一個生成json的程序
  • 當然也可以使用一些可視化的工具來寫json文件(比如:notepad–,還有一些ide都可以),但未免太過于麻煩
  • 本文會以一個以qmake搭建的qt項目為例,讀取項目中資源的文件,將文件分類生成一個json文件,并選擇json文件生成的目錄處

首先介紹下會用到的類

一.QDir類(Qt框架中用于處理目錄和路徑的類)

  • QDir的構造函數可以接收路徑參數(QString類型),QDir對象指向該路徑 QDir(const QString &path = QString())
  • 例如像這樣使用:
QString resoucePath=":/music/";//像這種加了:的相對路徑是已經放入項目中資源部分的文件路徑
QDir dir(resoucePath);
  • 可以使用entryList()方法輸出QDir對象指向目錄中內容,也就是文件名和子目錄,這個也就是我們要寫入json文件的數據,讀取文件路徑存入生成的json里
QStringList QDir::entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) constQStringList QDir::entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const  
//entryList方法可以不需要寫參數,可以看到可以有個重載不需要nameFilters參數,另兩個參數都初始化了
  • entryList方法返回一個QStringList類型,有三個參數,這三個參數分別為:
    名稱過濾器(nameFilters):根據文件名篩選條目
    過濾器(Filters):控制列處哪些類型的條目,也就是文件類型
    排序標志(SortFlags):控制條目列表的排序方式

  • 過濾器是一個QDir::Filters類型的枚舉值,可以通過位運算組合多個過濾器使用,常用過濾器:
    QDir::Dirs:只列出目錄
    QDir::Files:只列出文件
    QDir::NoDotAndDotDot:不列出.(當前目錄)和…(上級目錄)
    QDir::Hidden:列出隱藏文件
    QDir::NoSymLinks:不列處符號鏈接(符號鏈接就是我們看見的文件的快捷方式)
    QDir::Readable:只列出可讀的文件或目錄
    QDir::Writable: 只列出可寫的文件或目錄
    QDir::Executable:只列出可執行的文件或目錄
    QDir::System:列出系統文件

  • 排序標志是一個QDir::SortFlags類型的枚舉值,可以通過位運算組合多個排序標志,常見排序標志:
    QDir::Name:按名稱排序(也就是按文件名稱字母排序)
    QDir::Time:按修改時間排序
    QDir::Size:按文件大小排序
    QDir::Type:按文件類型排序
    QDir::Unsorted:不排序,按文件系統順序返回
    QDir::IgnoreCase:忽略大小寫排序
    QDir::DirsFirst:目錄優于文件
    QDir::DirsLast:目錄排在文件之后
    QDir::Reversed:反向排序

qDebug()<<dir.entryList();//輸出一遍看下
QStringList filters;//名稱過濾器
filters<<"*.mp3";//只獲取后綴名為MP3的文件
QStringList files=dir.entryList(filters,QDir::Files);//過濾器只列出文件,排序標志為初始的不排序

輸出示例如下:
在這里插入圖片描述

  • 還可以對目錄進行管理,例如使用 mkdir()rename()rmdir() 等方法創建、重命名或刪除目錄。這些功能以及其他功能就不演示了,畢竟本文沒有用上

二.QJsonObject類

  • QJsonObject類似于map,以鍵值對的形式存儲數據,其中鍵是字符串,值可以是QJsonValue類型(包括字符串,數字,布爾值,數組,對象等)。

  • 常用方法:
    1.插入數據:
    insert(const QString &key,const QJsonValue &value):插入一個鍵值對
    2.獲取數據:
    value(const QString &key) const:根據鍵獲取值
    operator[](const QString &key):通過鍵訪問值
    3.檢查鍵是否存在:
    contains(const QString &key) const:檢查是否包含某個值
    4.刪除數據:
    remove(const QString &key):刪除指定鍵的鍵值對
    5.轉換為JSON字符串:
    使用QJsonDocumentQJsonObject轉換為JSON字符串
    6.從JSON字符串解析:
    使用QJsonDocument將JSON字符串解析為QJsonObject

  • 示例:

    QJsonObject root;//QJsonObject的的值可以是數組,這個示例存儲的值是Json數組QJsonArray manList;QJsonArray womanList;QJsonArray bgmList;QJsonArray endingList;QJsonArray otherList;for(QString& file:files){QString filePath=resoucePath+file;if(file.startsWith("Man_")){//startsWith是用于檢查字符串是否以指定的前綴開頭manList.append(filePath);}else if(file.startsWith("Woman_")){womanList.append(filePath);}else if(file.startsWith("MusicEx_")){if(file.contains("Win")||file.contains("Lose")){endingList.append(filePath);}else{bgmList.append(filePath);}}else{otherList.append(filePath);}}root["Man"]=manList;//用不同的鍵分類存入root["Woman"]=womanList;root["BGM"]=bgmList;root["Ending"]=endingList;root["Other"]=otherList;

三.QJsonDocument類

  • 可以將QJsonObject和QJsonArray轉換為Json文檔

  • 常用方法:
    1.從Json字符串解析:
    static QJsonDocument fromJson(const QByteArray &json):從Json字符串解析為QJsonDocument
    2.從Json二進制數據解析:
    static QJsonDocument fromBinaryData(const QByteArray &data):從二進制數據解析為QJsonDocument
    3.轉換為Json字符串:
    QByteArray toJson(QJsonDocument::JsonFormat format=Indented):將QJsonDocument轉換為Json字符串
    這個方法對于生成的Json字符串格式有著一個枚舉類型的參數:
    enum JsonFormat{Indented,Compact}:Indented是格式化的Json字符串(帶縮進),Compact是緊湊的Json字符串
    4.轉換為二進制數據:
    QByteArray toBinaryData():將QJsonDocument轉換為二進制數據
    5.獲取Json數據:
    QJsonObject object() const :如果文檔里包含QJsonObejct,則返回該對象
    QJsonArray array() const:如果文檔里包含QJsonArray,則返回該數據
    6.檢查文檔類型:
    bool isObject() const:檢查文檔是否包含QJsonObject
    bool isArray() const:檢查文檔里是否包含QJsonArray
    7.檢查文檔是否為空:
    bool isEmpty() const:檢查文檔是否為空

四.QFile類(對文件的操作)

  1. 打開文件:
    bool open(QIODevice::OpenMode mode):以指定模式打開文件
    常用模式:
    QIODevice::ReadOnly:只讀模式
    QIODevice:WriteOnly:只寫模式
    QIODevice::ReadWrite:讀寫模式
    QIODevice::Append:追加模式
    QIODevice::Truncate:清空文件內容
  2. 關閉文件
    void close():關閉文件
  3. 讀取文件
    QByteArray readAll():讀取文件所有內容
    QByteArray read(qint64 maxSize):讀取指定大小的內容
    QString readLine():讀取一行內容
  4. 寫入文件
    qint64 write(const QByteArray &data):寫入數據
    qint64 write(const char* data,qint64 len):寫入指定長度的數據
  5. 文件管理
    bool copy(const QString &newName):復制文件
    bool rename(const QString &newName):重命名文件
    bool remove():刪除文件
  6. 文件信息:
    qint64 size():獲取文件大小
    bool exists():檢查文件是否存在
  7. 錯誤處理:
    QFile::FileError error():獲取錯誤碼
    QString errorString():獲取錯誤信息

關于最終Json文件的生成的目錄

  • 首先要知道在使用QFile類對象創建文件對象時,如果沒有指定文件的完整路徑,那么該文件會被創建在當前項目工作目錄,比如這樣創建時:
    QFile jsonFile("PlayList.json");,當前工作目錄可以用QDir::currentPath()獲取,返回類型是QString,
    打印:qDebug()<<QDir::currentPath()

  • 如果想獲取當前應用程序的可執行文件所在的目錄的路徑,可以使用QCoreApplication::applicationDirPath(),返回類型為QString

  • 如果你想將文件生成在根目錄也就是與.pro同級目錄,
    在.pro文件添加以下兩句:

//定義PRO_DIR為當前.pro文件所在的目錄
PRO_DIR = $$PWD
//將PRO_DIR作為宏定義傳遞給C++代碼,\\\"是為了確保PRO_DIR的值
DEFINES += PRO_DIR=\\\"$$PRO_DIR\\\"

完整實例生成Json文件代碼:

  • 這個例子是寫一個類來實現將Json文件生成在項目根目錄的,讀取項目中資源的文件:

頭文件:

#ifndef BGMLIST_H
#define BGMLIST_H#include <QObject>class BGMList : public QObject
{Q_OBJECT
public:explicit BGMList(QObject *parent = nullptr);QString getProjectRootPath();//該函數返回Json生成的目錄
signals:
private:
};#endif // BGMLIST_H
#include "bgmlist.h"
#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>BGMList::BGMList(QObject *parent): QObject{parent}
{QString resoucePath=":/music/";//像這種加了:的相對路徑是已經放入項目中資源部分的文件路徑QDir dir(resoucePath);//qDebug()<<dir.entryList();if(!dir.exists()){qDebug()<<"資源路徑不存在";return;}qDebug()<<resoucePath;QStringList filters;//名稱過濾器filters<<"*.mp3";//只獲取后綴名為MP3的文件QStringList files=dir.entryList(filters,QDir::Files);//過濾器只列出文件,排序標志為初始的不排序QJsonObject root;QJsonArray manList;QJsonArray womanList;QJsonArray bgmList;QJsonArray endingList;QJsonArray otherList;for(QString& file:files){QString filePath=resoucePath+file;if(file.startsWith("Man_")){//startsWith是用于檢查字符串是否以指定的前綴開頭manList.append(filePath);}else if(file.startsWith("Woman_")){womanList.append(filePath);}else if(file.startsWith("MusicEx_")){if(file.contains("Win")||file.contains("Lose")){endingList.append(filePath);}else{bgmList.append(filePath);}}else{otherList.append(filePath);}}root["Man"]=manList;root["Woman"]=womanList;root["BGM"]=bgmList;root["Ending"]=endingList;root["Other"]=otherList;QJsonDocument doc(root);QString projectRootPath=getProjectRootPath()+"/PlayList.json";//Json文件的目錄QFile jsonFile("PlayList.json");//qDebug()<<QDir::currentPath();if(jsonFile.open(QIODevice::WriteOnly)){//只寫模式jsonFile.write(doc.toJson());jsonFile.close();qDebug()<<"PlayList.json已生成";}else{qDebug()<<"未生成";}
}QString BGMList::getProjectRootPath()
{QString appDir=QCoreApplication::applicationDirPath();//qDebug()<<appDir;QDir dir(appDir);dir.cdUp();//qDebug()<<PRO_DIR;//$$PWD就是.pro文件的目錄級別return PRO_DIR;}
  • Json文件截圖展示:
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71411.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國產編輯器EverEdit -告別東找西找!一鍵打開當前文件所在目錄!

1 文件操作 2 應用場景 在文件編輯過程中&#xff0c;有時需要對文件進行一些操作&#xff0c;比如&#xff1a;在命令窗口輸入文件路徑、文件名&#xff0c;進入到文件目錄&#xff0c;對文件進行壓縮等&#xff0c;如果沒有直達命令&#xff0c;用戶需要通過文件管理器找到目…

【Docker】百度網盤:基于VNC的Web訪問及后臺下載

本教程通過 Docker Compose 部署百度網盤的 VNC 版本&#xff0c;實現24小時不間斷下載、雙模式訪問、數據持久化、自動重啟和安全加密控制等核心功能。 目錄結構規劃 建議使用以下目錄結構&#xff08;可根據實際情況調整&#xff09;&#xff1a; ~/baidunetdisk/├── d…

立創實戰派ESP32-S3燒錄小智AI指南

小智 AI 聊天機器人-開源項目介紹 本項目是一個開源項目&#xff0c;主要用于教學目的。我們希望通過這個項目&#xff0c;能夠幫助更多人入門 AI 硬件開發&#xff0c;了解如何將當下飛速發展的大語言模型應用到實際的硬件設備中。無論你是對 AI 感興趣的學生&#xff0c;還是…

【設計模式】【創建型模式】原型模式(Prototype)

&#x1f44b;hi&#xff0c;我不是一名外包公司的員工&#xff0c;也不會偷吃茶水間的零食&#xff0c;我的夢想是能寫高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 歡迎點贊、收藏、關注&#xff0c;跟上我的更新節奏 &#x1f3b5; 當你的天空突…

Weblogic 反序列化漏洞深度剖析與復現

目錄 一、引言 二、Weblogic 反序列化漏洞原理 &#xff08;一&#xff09;什么是反序列化 &#xff08;二&#xff09;Weblogic 反序列化漏洞產生機制 三、Weblogic 反序列化漏洞危害 四、Weblogic 反序列化漏洞復現 &#xff08;一&#xff09;復現環境準備 &#xff…

2025年02月19日Github流行趨勢

項目名稱&#xff1a;OmniParser 項目地址url&#xff1a;https://github.com/microsoft/OmniParser 項目語言&#xff1a;Jupyter Notebook 歷史star數&#xff1a;12878 今日star數&#xff1a;2153 項目維護者&#xff1a;yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kr…

深入解析 iOS 視頻錄制(三):完整錄制流程的實現與整合

深入解析 iOS 視頻錄制&#xff08;一&#xff09;&#xff1a;錄制管理核心MWRecordingController 類的設計與實現 深入解析iOS視頻錄制&#xff08;二&#xff09;&#xff1a;自定義UI的實現??????? 深入解析 iOS 視頻錄制&#xff08;三&#xff09;&#xff1a;完…

基于豆瓣2025電影數據可視化分析系統的設計與實現

??本項目旨在通過對豆瓣電影數據進行綜合分析與可視化展示&#xff0c;構建一個基于Python的大數據可視化系統。通過數據爬取收集、清洗、分析豆瓣電影數據&#xff0c;我們提供了一個全面的電影信息平臺&#xff0c;為用戶提供深入了解電影產業趨勢、影片評價與演員表現的工…

tcp協議連接,和傳輸數據

1、連接 這個是通用的 2、傳送數據 當連接建立后&#xff0c;客戶端和服務器都可以主動發送數據&#xff0c;分別如下 1》客戶端先發送數據 這里是單向的&#xff0c;服務器沒有對客戶端的數據內容進行應答&#xff0c;只是單純的對報文應答ack 2》服務器先發送數據

2024年國賽高教杯數學建模C題農作物的種植策略解題全過程文檔及程序

2024年國賽高教杯數學建模 C題 農作物的種植策略 原題再現 根據鄉村的實際情況&#xff0c;充分利用有限的耕地資源&#xff0c;因地制宜&#xff0c;發展有機種植產業&#xff0c;對鄉村經濟的可持續發展具有重要的現實意義。選擇適宜的農作物&#xff0c;優化種植策略&…

鴻蒙開發:V2版本裝飾器之@Monitor裝飾器

前言 本文代碼案例基于Api13。 隨著官方的迭代&#xff0c;在新的Api中&#xff0c;對于新的應用開發&#xff0c;官方已經建議直接使用V2所屬的裝飾器進行開發了&#xff0c;所以&#xff0c;能上手V2的盡量上手V2吧&#xff0c;畢竟&#xff0c;V2是V1的增強版本&#xff0c;…

國產編輯器EverEdit - 獨門暗器:自動監視剪貼板內容

1 監視剪貼板 1.1 應用場景 如果需要對剪貼板的所有歷史進行記錄&#xff0c;并進行分析和回顧&#xff0c;則可以使用監視剪貼板功能&#xff0c;不僅在EverEdit中的復制會記錄&#xff0c;在其他應用的復制也會記錄。 1.2 使用方法 新建一個空文檔(重要&#xff1a;防止擾亂…

pdf轉換成word在線 簡單好用 支持批量轉換 效率高 100%還原

pdf轉換成word在線 簡單好用 支持批量轉換 效率高 100%還原 在數字化辦公的浪潮中&#xff0c;文檔格式轉換常常讓人頭疼不已&#xff0c;尤其是 PDF 轉 Word 的需求極為常見。PDF 格式雖然方便閱讀和傳輸&#xff0c;但難以編輯&#xff0c;而 Word 格式卻能靈活地進行內容修…

深入探索C語言中的字符串處理函數:strstr與strtok

在C語言的字符串處理領域&#xff0c; strstr 和 strtok 是兩個非常重要的函數&#xff0c;它們各自承擔著獨特的功能&#xff0c;為開發者處理字符串提供了強大的支持。 一、strstr函數&#xff1a;字符串查找的利器 strstr 函數用于在一個字符串中查找另一個字符串的首次出現…

AIGC(生成式AI)試用 21 -- Python調用deepseek API

1. 安裝openai pip3 install openai########################## Collecting openaiUsing cached openai-1.61.1-py3-none-any.whl.metadata (27 kB) Collecting anyio<5,>3.5.0 (from openai)Using cached anyio-4.8.0-py3-none-any.whl.metadata (4.6 kB) Collecting d…

關于使用雪花算法生成唯一ID,返回給前端ID不一致的問題

問題 在某個項目中,使用雪花算法生成的唯一ID,從數據庫查詢到數據后返回給前端,但是前端接受到的數據ID和數據庫原先生成的不一致 但是前端展示的數據: 原因 原因是后端使用Long類型來存儲雪花算法生成的ID,但是這個數值已經超過前端數值類型的范圍,導致前端在存儲這個數值…

Windows 啟動 SSH 服務

Windows 啟動 SSH 服務 一、OpenSSH Server 安裝 以 Win10 系統為例 打開設置 -> 系統 -> 可選功能 在 添加的功能 查看是否安裝了 OpenSSH 服務 或者 OpenSSH Server 如果沒有安裝&#xff0c;找到 系統->添加可選功能 -> 查看功能->搜索 OpenSSH 服務 ->…

C#功能測試

List 內部元素為引用 src[0]為"11" List<Source> src new List<Source>(); src.Add(new Source() { Name "1", Age 1, Description "1" }); src.Add(new Source() { Name "2", Age 2, Description "2"…

大數據SQL調優專題——Flink執行原理

引入 上一篇我們了解了Spark&#xff0c;相比起MapReduce來說&#xff0c;它確實已經快了超級多了&#xff0c;但是人類的欲望是沒有止境的&#xff0c;這也是推動人類進步的動力。 Flink就是為了滿足實時響應的場景需求誕生的。 其實在Flink之前&#xff0c;實時處理其實已…

計算機視覺:神經網絡實戰之手勢識別(附代碼)

第一章&#xff1a;計算機視覺中圖像的基礎認知 第二章&#xff1a;計算機視覺&#xff1a;卷積神經網絡(CNN)基本概念(一) 第三章&#xff1a;計算機視覺&#xff1a;卷積神經網絡(CNN)基本概念(二) 第四章&#xff1a;搭建一個經典的LeNet5神經網絡(附代碼) 第五章&#xff1…