Skip to content

Qt图形库概述:文件与目录

QIODevice类

QIODevice作为Qt中所有输入输出(IO)设备类的抽象基类,为各类IO操作提供了基础的功能接口,涵盖了设备的打开、关闭、数据读取和写入等操作。它还定义了一系列的枚举类型(例如OpenMode)以及信号槽机制,用于处理IO操作期间的状态变化和事件通知。

QIODevice属于抽象类,无法直接进行实例化。其他具体的IO设备类,如QFile、QBuffer等,均继承自QIODevice,以实现各自特定类型的IO操作。

重要成员函数

  • open(OpenMode mode):此函数用于打开设备,其中OpenMode是一个枚举类型,可指定打开设备的模式,例如只读(ReadOnly)、只写(WriteOnly)、读写(ReadWrite)等。
  • read(qint64 maxSize):从设备中读取数据,maxSize参数用于指定最多读取的字节数,函数返回读取到的数据,其类型为QByteArray。
  • write(const QByteArray& byteArray):向设备写入数据,参数byteArray为要写入的数据,函数返回实际写入的字节数。
  • close():用于关闭已打开的设备,释放相关资源。

信号与槽机制

  • aboutToClose():当设备即将关闭时,会发射此信号。
  • bytesWritten(qint64 bytes):在有数据写入设备时发射,参数bytes表示写入的字节数。

在Qt中IO操作的处理方式

  • 统一的接口简化了文件与外部设备的操作方式
  • Qt中的文件被看做是一种特殊的外部设备
  • Qt中的文件操作与外部设备操作相同

Qt中IO设备类型

  • 顺序存储设备:只能从头开始顺序读写数据,不能指定数据的读写位置(如串口)
  • 随机存储设备:可以定位到任意位置进行数据读写(通过seek function函数)(如文件)

QT IO操作类型

类名作用
QFileQFile是Qt中用于文件操作的类,直接支持文本文件(可读文本字符)和数据文件(二进制数据)的读写
QFileInfo用于读取文件属性信息
QTemporaryFile安全创建全局唯一的临时文件,用于大数据传递或进程间通信
QTextStream写入的数据全部转化为可读文本
QDataStream写入的数据根据类型转换为二进制
QBuffer缓冲区的本质为一段连续的存储空间,QBuffer是Qt中缓冲区相关的类
QDir是Qt中功能强大的目录操作类
QFileSystemWatcher用于监控文件和目录的状态变化(内容修改、重命名、删除等)

QFile类

在Qt中,QFile类主要用于对文件进行读写操作。QFile直接继承自QIODevice,是专门针对文件操作的类,能够支持文本文件和数据文件的读写。

特点

  • 能够对文件执行常规的读写操作,例如打开、关闭、读取全部内容(readAll)、按行读取(readLine)、写入数据(write)等。
  • 提供了获取文件详细信息的功能,例如文件路径(path)、文件名(fileName)、文件后缀(suffix)、文件大小(size)、创建时间(created)、最后修改时间(lastModified)等(需通过QFileInfo类获取)。

常用方法

  • open(打开方式):打开文件
    • QIODevice::WriteOnly:以只写方式打开,新内容会覆盖原内容。
    • QIODevice::ReadWrite:以读写方式打开,打开时指针在文件头部,内容从文件头开始追加。
    • QIODevice::Append:以追加方式打开,打开时指针在文件尾部,内容从尾部开始追加。
  • qint64 write(QByteArray):向文件中写入内容,返回值为写入的字符串长度。
  • QByteArray read(qint64):从文件中读取内容,并返回一个QByteArray,参数为需要读取的最大字节数。
  • void close():关闭文件。

QBuffer类

QBuffer继承自QIODevice,它为内存缓冲区提供了输入输出操作的功能。

特点

  • 缓冲区本质上是一段连续的存储空间,QBuffer将其封装为可进行输入输出操作的对象。
  • 可以像操作文件一样对缓冲区进行打开(open)、写入(write)、读取(read)和关闭(close)操作。通常与QByteArray结合使用,将数据存储在内存中进行临时处理或在不同组件之间传递数据。

常用方法

  • atEnd():判断是否已到达缓冲区末尾。
  • seek(qint64 pos):设置读取位置。

QAbstractSocket类

QAbstractSocket继承自QIODevice,是Qt中所有套接字类(如QTcpSocket、QUdpSocket)的抽象基类。

特点

  • 提供了与网络套接字相关的基本功能,例如连接到服务器(connectToHost)、监听端口(listen)、获取套接字状态(state)、获取本地和远程地址(localhost、peerAddress)等。
  • 实现了异步的网络通信机制,通过信号槽机制(如connected、disconnected、readyRead等信号)处理网络事件,方便开发者进行网络编程。

常用方法

  • error():获取套接字的错误。
  • flush():刷新输出缓冲区。

QProcess类

QProcess继承自QIODevice,用于启动外部程序并与之进行交互(例如获取程序输出、向程序输入数据等)。

特点

  • 可以启动外部应用程序,并设置程序的启动参数(setArguments)、工作目录(setWorkingDirectory)等。
  • 通过信号(如started、finished、readyReadStandardOutput等)和函数(如write、readAllStandardOutput等)与外部程序进行通信,获取程序的执行结果或向程序输入数据。

常用方法

  • startDetached():以分离模式启动进程。
  • kill():终止进程。

QDir类

QDir继承自QObject,提供了跨平台的目录操作接口,能够处理不同操作系统的目录结构和文件属性的差异。用于操作文件系统中的目录,包括获取目录信息、创建、删除目录,以及遍历目录中的文件和子目录等。

QDir用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问Qt的资源系统。QDir可以使用相对路径或绝对路径指向文件:

  • 绝对路径:以目录分隔符开头(在Windows下,可以选择以驱动器规格开头)
  • 相对路径:以目录名或文件名开头,并指定相对于当前目录的路径

常用方法

  • 构造函数QDir(const QString &path = QString())
  • 判断路径是否存在bool exists() const
  • 判断是否是文件bool isFile() const
  • 判断是否是文件夹bool isDir() const
  • 获取当前路径QString absolutePath() const
  • 获取文件名QString fileName() const
  • 获取文件目录QString dirName() const
  • 获取文件大小qint64 size() const
  • 获取文件的创建时间QDateTime created() const
  • 获取文件的最后修改时间QDateTime lastModified() const
  • 创建新的目录mkdir()
  • 删除空目录rmdir()
  • 获取目录中的文件和子目录列表entryList()

作业

实现一个文本编辑器,需包含以下功能:

  1. 树状列表:显示工作路径及其子目录与文件结构
  2. 文本编辑区域:支持多行文本编辑的基础功能
  3. 文件操作选项
    • 保存文件
    • 打开单个文件
    • 打开整个文件夹(在树状列表中显示目录结构)

知识如风,常伴吾身