Qt:文件

目录

前言

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:文件学习到此结束

相关推荐
王有品5 分钟前
python之爬虫入门实例
开发语言·爬虫·python
一水鉴天9 分钟前
为AI聊天工具添加一个知识系统 之135 详细设计之76 通用编程语言 之6
开发语言·人工智能·架构
m0_7482475521 分钟前
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
java·开发语言·数据库
环能jvav大师38 分钟前
Electron桌面应用开发:自定义菜单
开发语言·前端·javascript·windows·electron
一水鉴天1 小时前
为AI聊天工具添加一个知识系统 之136 详细设计之77 通用编程语言 之7
开发语言·人工智能·架构
一只小小汤圆1 小时前
c++ std::tuple用法
开发语言·c++
Jelena157795857921 小时前
爬虫与翻译API接口的完美结合:开启跨语言数据处理新纪元
开发语言·数据库·爬虫
gyc27271 小时前
快速熟悉JavaScript
开发语言·前端·javascript
越甲八千1 小时前
C++海康相机DEMO
开发语言·c++·数码相机
0白露2 小时前
PHP之特性
开发语言·php