QT -文件IO

QFileDialog用于打开或保存文件的对话框,QFileInfo提供文件属性如存在、大小、时间等信息,QFile实现文件的读写。当长时间的IO操作如大文件拷贝阻塞主线程时,UI会变得不响应。QThread可用于避免这种问题,通过msleep函数模拟阻塞操作。
摘要由CSDN通过智能技术生成

1. QFileDialog 文件对话框

QFileDialog继承自QDialog,是一个用于选择读写文件或目录的对话框。与QMessageBox类似,也通过静态成员函数的调用显示弹窗。

// 参数1:父对象
// 参数2:窗口标题
// 参数3:在哪个目录中打开,如果使用默认值(空字符串),则为当前项目的构建目录
// 参数4:文件格式过滤器
// 返回值:选择的文件路径,选择失败为空字符串
QString QFileDialog::getOpenFileName|getSaveFileName(
                           QWidget * parent = 0, 
							const QString & caption = QString(), 
							const QString & dir = QString(), 
							const QString & filter = QString()) [static]

需要注意的是,QFileDialog本身只是一个窗口类,不具备任何IO功能。

2. QFileInfo 文件信息类

QFileInfo类可以获取某个文件的各种信息,常用函数如下:

// 构造函数
// 参数是文件路径,如果路径是非法路径,可以创建对象
QFileInfo::QFileInfo(const QString & file)// 判断对应路径下是否存在文件或目录
bool QFileInfo::exists() const// 获得文件的创建|上次修改|上次读取的时间
QDateTime QFileInfo::created() const
QDateTime QFileInfo::lastModified() const
QDateTime QFileInfo::lastRead() const// 判断送入的路径对应的是不是一个目录|文件|可执行文件
bool QFileInfo::isDir() const
bool QFileInfo::isFile() const
bool QFileInfo::isExecutable() const
// 文件是否隐藏|可读|可写|可执行bool QFileInfo::isHidden() const
bool QFileInfo::isReadable() const
bool QFileInfo::isWritable() const
bool QFileInfo::isExecutable() const
// 获取文件大小,单位字节qint64 QFileInfo::size() const

3. QFile 文件读写类

QFile类是真正进行文件读写的类型,间接继承了QIODevice类,QIODevice类是Qt中所有IO相关类型的基类,内部规定了最基础的读写接口。

相关函数如下所示。

// 构造函数,参数为文件路径,如果是非法路径,也能创建出对象
QFile::QFile(const QString & name)
// 打开文件输入输出流
// 参数为打开的模式
bool QIODevice::open(OpenMode mode) [virtual]
// 是否读取到文件尾
bool QIODevice::atEnd() const [virtual]
// 读取数据
// 参数:最大读取的字节量
// 返回值:读取的数据
QByteArray QIODevice::read(qint64 maxSize)
// 写出数据
// 参数:要写出的数据内容
// 返回值:实际写出的数据量,-1为出错
qint64 QIODevice::write(const QByteArray & byteArray)
// 关闭流
void QIODevice::close() [virtual]
// 清空文件读写的缓存区数据
bool QFileDevice::flush()
// 返回可用数据的大小
qint64 QIODevice::size() const [virtual]

4. UI操作与耗时操作

在默认的情况下,Qt应用程序只有一个线程,这个线程也被称为主线程。主线程主要的执行任务是程序运行的主要逻辑操作和UI操作,因此主线程也被称为UI线程。

但是当单线程的文件拷贝器拷贝大文件时,会导致主线程持续长期执行文件拷贝的耗时操作(一些IO、巨型计算等),此时用户的UI操作被耗时操作阻塞,无法及时响应,因此会出现UI卡顿的现象。

包括关闭命令都是在主线程中执行的,当操作系统发现某程序关闭命令无法及时响应时,会弹出程序未响应窗口,引导用户等待或关闭当前主线程阻塞的应用程序。

5. 复现未响应

QThread类是Qt的线程类,其中有一个函数特别适合模拟阻塞的操作:

// 强制CPU在当前线程睡眠固定的毫秒数
void QThread::msleep(unsigned long msecs) [static]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SaberTimo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值