Qt:文件

server/2025/3/6 22:47:00/

目录

前言

QFile的使用

QFileInfo的使用


前言

关于文件相关操作,之前也学习过很多:

  • C语言中
    fopen 打开文件
    fread fwrite 读写文件
    fclose 关闭文件
  • C++中
    fstream 打开文件
    << >> 读写文件
    close 关闭文件
  • Linux中
    open 打开文件
    read write 读写文件
    close 关闭文件

Qt 也提供了一套文件操作
Qt 中使用上述的几种方案来读写文件,也是完全可以的(Linux 这一套,局限于 Linux 系统,Windows 上的 Qt,就需要使用 Windows api)

但是即使如此,Qt 还是又封装了一套,原因就是:
Qt 诞生的太早了,当时 C++ 还没有"标准化"概念

所以咱们在编写 Qt 程序的时候,更推荐使用 Qt 自己提供的这一套文件操作,和 QString 等 Qt 内置的类可以很好的配合

Qt中的文件操作,核心操作也是这几个部分,打开、读、写、关闭
是通过 QFile 类,完成上述文件操作的

从下图可以看到,QFile 继承自 QFileDevice,QFileDevice 继承自 QIODevice:

  • QTemporaryFile:是 QFile 的子类 ,表示临时用一下,这个对象销毁,对应的文件就自动删除了
  • QSaveFile:要写入大量的数据,写文件的时候,往往会把旧的文件先清空再写,万一新的数据写一半,结果出错了,新的数据用不了旧的数据也无了
    所以通过 QSaveFile 类,如果你要想写一个文件,会自动的把内容先写到临时文件里(不会破坏原有的文件),等到所有内容都写完了之后,再把旧文件自动删掉,并且用新的文件替换旧的文件
    这种策略是一个广泛的策略
  • QTcpSocket、QUdpSocket:通过 Qt 进行简单的网络编程
  • QSerialPort:对串口进行读写操作,串口是一种比较古老的通信方式,一般是在嵌入式系统上
  • QBluetoothSocket:进行蓝牙通信
  • QProcess:进行进程间通信,相当于是对 fork/exec 操作进行的封装,
  • QBuffer:是 Qt 内置的缓冲区类

QFile的使用

  • 打开 open
  • 读 read / readLine /readAll
  • 写 write
  • 关闭 close

QFile 构造时,需要提供文件的路径:
可以使用绝对路径,也可以使用相对路径


open

 下面两个 open 的重载函数,一个是从 FILE* 中打开,另一个是针对文件描述符打开,使用下面两种函数,还需要搭配C语言或系统原生API去打开,是比较麻烦的

所以更常用的是下面的 open 重载函数,直接可以按照前面指定的路径打开:

构造函数中,指定了路径之后,此时直接通过这个版本的 open 打开即可

OpenMode 打开方式,有下面三种:

  • 读方式
  • 写方式
  • 追加写方式

read / readAll / readLine

下面两个 read 的重载函数,区别就是通过参数 data 返回,还是通过返回值 QByteArray 返回:

readAll 就是一次性读取所有的数据

readLine 一次读取一行,也是一样的效果

  • QByteArray 就是 Qt 针对字节数组进行的封装
  • QByteArray 很方便的转成 QString

write

write 也有好几个版本:
可以指定字符数组,也可以指定 QByteArray


close

关闭本质上是要释放文件描述符表中的表项,文件描述符表存在上限
如果一直打开,不关闭的话,就可能会使文件描述符表被占满,后续再尝试打开,就打开不了了


使用示例

下面使用代码演示 Qt 的文件操作

在构造函数中创建菜单,在中心创建一个多行输入框:

效果为:

接着给上面的两个菜单项 connect 槽函数:

打开 的槽函数实现如下:

保存 的槽函数实现如下:

运行程序,输入一段文本后,点击保存,就会有下面的这个页面弹出,我们输入文件名为 hello.txt:

打开刚刚路径下的 hello.txt,就有我们输入的内容:

如果我们手动将 hello.txt 文件内容改变,接着点击打开文件,就会在 多行输入框 中显示内容了:


QFileInfo的使用

类似于这样的功能,在C/C++ 标准库中本来都是没有的,所以要想使用类似的功能往往要使用系统 api
在 C++17 才引入了模块 filesystem

OFilelnfo 是 Qt提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等,QFileInfo类中提供了很多的方法,常用的有:

  • isDir():检查该文件是否是目录
  • isExecutable():检查该文件是否是可执行文件
  • fileName():获得文件名
  • completeBaseName():获取完整的文件名
  • suffix():获取文件后缀名
  • completeSuffix():获取完整的文件后缀
  • size():获取文件大小
  • isFile():判断是否为文件
  • fileTime():获取文件创建时间、修改时间、最近访问时间等;

图形化界面的方式创建一个按钮,并右键转到槽,选择 clicked 信号:

槽函数实现如下:

运行程序:

点击弹出对话框按钮:

选择 ui_widget.h,就会打印相关属性:


Qt:文件学习到此结束


http://www.ppmy.cn/server/172989.html

相关文章

如何配置虚拟机连接finalshell并克隆

在VMware中我们在后期的学习中是必须要用到fianlshell这个工具&#xff0c;首先在我们在VMware中将虚拟机的IP全部完成后&#xff0c;可以开始克隆 了。 找到自己的虚拟机&#xff0c;先关闭虚拟机&#xff0c;然后右键管理&#xff0c;找到克隆&#xff0c;在一步步的下一步后…

[Computer Vision]实验六:视差估计

目录 一、实验内容 二、实验过程 2.1.1 test.py文件 2.1.2 test.py文件结果与分析 2.2.1 文件代码 2.2.2 结果与分析 一、实验内容 给定左右相机图片&#xff0c;估算图片的视差/深度&#xff1b;体现极线校正&#xff08;例如打印前后极线对&#xff09;、同名点匹配…

Java进阶:Dubbo

分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 软件架构的发展经历了由单体架构、垂直架构、SOA架构到微服务架构的演进过程&#xff0c;下面我们分别了解一下这几个架构。 1.1 单体架构 架构说明&#xff1a; 全部功能集中在一个项目内&#xff08;All in one&#xf…

kafka小白基础知识

一、Kafka 入门 &#xff08;一&#xff09;Kafka 简介 Kafka 是一个开源的分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后来贡献给了 Apache 软件基金会。它被设计用于处理实时数据流&#xff0c;具有高吞吐量、可扩展性、持久性和容错性等特点。Kafka 主要…

Raspberry Pi边缘计算网关设计与LoRa通信实现

Raspberry Pi边缘计算网关设计与LoRa通信实现 摘要第一章 绪论1.1 研究背景1.2 研究现状1.3 论文结构 第二章 相关技术理论2.1 边缘计算体系架构2.2 LoRa通信技术2.3 Raspberry Pi硬件生态 第三章 系统架构设计3.1 硬件架构设计3.2 软件架构设计3.3 混合通信协议设计 第四章 硬…

AF3 pair_and_merge函数解读

AlphaFold3 feature_processing_multimer 模块的 pair_and_merge 函数是 AlphaFold3 数据处理管道 中的重要函数,它主要负责: 处理各个链的特征(all_chain_features);决定是否对 MSA 特征进行配对(pair_msa_sequences);合并各个链的特征,并最终返回一个包含所有特征的…

rust编程实战:实现3d粒子渲染wasm

源码 纯js实现 fps&#xff1a; wasm实现 通过对比可以看出来 wasm 实现的计算比纯js刷新相对稳定。

OCCT 学习笔记:创建瓶子教程的三个关键知识点

对OCCT已经有了多年了解&#xff0c;但时不时还是要翻一翻它的官方文档。今天重读了&#xff1a;Bottle Tutorial 教程概况 这篇教程文档围绕使用Open CASCADE Technology进行3D建模展开&#xff0c;以创建一个瓶子模型为例&#xff0c;逐步介绍建模过程及相关技术要点&#x…