Qt:文件

news/2025/3/6 10:20:52/

目录

前言

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/news/1577040.html

相关文章

Django模型数据修改:详解两种方式

Django模型数据修改&#xff1a;详解两种方式 在Django框架中&#xff0c;数据模型&#xff08;Model&#xff09;定义了应用的数据结构&#xff0c;并提供了与数据库交互的接口。数据的修改是Django开发中的常见操作之一。本文将详细介绍两种在Django中修改数据的方式&#x…

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈&#xff0c;总结了一下主要以下几点&#xff1a; 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文&#xff0c;如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…

Python的那些事第三十九篇:MongoDB的Python驱动程序PyMongo

PyMongo:MongoDB的Python驱动程序 摘要 PyMongo 是 MongoDB 的官方 Python 驱动程序,用于在 Python 应用程序中与 MongoDB 数据库进行交互。本文将详细介绍 PyMongo 的安装、基本操作、高级功能以及实际应用案例,并通过示例代码和表格展示其强大的功能和灵活性。 1. 引言 …

【AI深度学习基础】Pandas完全指南终极篇:构建企业级数据工程与AI应用 (含完整代码)

&#x1f4da; Pandas 系列文章导航 入门篇 &#x1f331;进阶篇 &#x1f680;终极篇 &#x1f30c; &#x1f30c; 前言 通过前两篇的学习&#xff0c;我们已掌握 Pandas 的核心操作与高阶技巧。本篇将突破工具边界&#xff0c;探索 生产级数据工程架构设计、亿级数据处理方…

【2025小白版】计算复试/保研机试模板(个人总结非GPT生成)附代码

一、编程语言选择 很多高校在机试中对编程语言都有明确规定&#xff0c;像复旦大学计算机学院就说明可选择 C、C 或 Java 语言答题&#xff0c;还支持 C11&#xff08;gcc5.4&#xff09;&#xff0c;C14&#xff08;g5.4&#xff09;&#xff0c;Java (openjdk1.8&#xff09…

AJAX 入门:从基础到实践

1.1 AJAX 介绍 AJAX 是一种用于创建快速动态网页的技术&#xff0c;它结合了 JavaScript 和 XML&#xff08;虽然现在也常用 JSON 数据格式&#xff09;。通过在后台与服务器进行少量数据交换&#xff0c;AJAX 可以使网页实现异步更新。这意味着在不重新加载整个网页的情况下&…

GPU 英伟达GPU架构回顾

1999 年&#xff0c;英伟达发明了 GPU&#xff08;graphics processing unit&#xff09;&#xff0c;本节将介绍英伟达 GPU 从 Fermi 到 Blackwell 共 9 代架构&#xff0c;时间跨度从 2010 年至 2024 年&#xff0c;具体包括费米&#xff08;Feimi&#xff09;、开普勒&#…

【CXX】4.4 其他构建系统

你需要至少完成以下三件事&#xff1a; 生成CXX生成的C绑定代码。 编译生成的C代码。 将生成的目标文件与你的其他C和Rust目标文件链接在一起。 并非所有构建系统都是平等的。如果你希望使用90年代的构建系统&#xff0c;尤其是如果你希望覆盖2个或更多构建系统&#xff08…