使用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.mzph.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…