Qt中的文件IO

目录

1. QFileDialog 文件对话框(熟悉)

2. QFileInfo 文件信息类(熟悉)

3. QFile 文件读写类

4. UI与耗时操作

5. QThread 线程类(掌握)

5.1 复现未响应

5.2 创建并启动线程

5.3 优先级

5.4 线程停止


1. QFileDialog 文件对话框(熟悉)

Qt预设的用于选择文件或目录的对话框窗口类,继承自QDialog。QFileDialog本身不具备IO功能。

调用窗口通过静态成员函数:

此函数可以展示一个用于读取/保存单文件的对话框窗口。

参数1:父对象

参数2:窗口标题

参数3:基于哪个目录,默认为项目的工作目录

参数4:文件类型过滤器

返回值:用户选择的文件路径,如果选择失败,返回空字符串

示例代码下载链接:百度网盘 请输入提取码

提取码:hqyj

--来自百度网盘超级会员V6的分享

2. QFileInfo 文件信息类(熟悉)

QFileInfo类用于获取文件信息。

常用函数如下所示。

  • QFileInfo::QFileInfo(const QString & file)

构造函数,参数是文件路径,需要注意的是参数无论是内容,QFileInfo对象都可以创建。

  • QDateTime QFileInfo::created() const

返回文件的创建日期和时间

  • bool QFileInfo::exists() const

文件是否存在

  • bool QFileInfo::isReadable() const

是否可读

  • qint64 QFileInfo::size() const

文件大小,返回的单位是字节

示例代码下载链接:百度网盘 请输入提取码

提取码:hqyj

--来自百度网盘超级会员V6的分享

3. QFile 文件读写类

QFile类是进行文件读写的类,QIODevice是Qt所有IO类的基类,因此QIODevice类规定了很多IO通用的基础接口。

QFile类的常用函数如下所示。

  • QFile::QFile(const QString & name)

构造函数,参数为读写文件的路径

  • bool QIODevice::open(OpenMode mode) [virtual]

打开文件读写的数据流,参数为打开的模式。

  • bool QIODevice::atEnd() const [virtual]

是否读到文件尾

  • QByteArray QIODevice::read(qint64 maxSize)

读取最大字节数的数据,参数是最大字节数,返回值是读取后的字节数组对象。

  • qint64 QIODevice::write(const QByteArray & byteArray)

写出数据到文件,参数为需要写出的数据,返回值是实际写出的数据量,如果返回-1表示写出错误。

  • void QIODevice::close() [virtual]

关闭数据流

  • qint64 QIODevice::size() const [virtual]

获取可读的字节数

示例代码下载链接:https://pan.baidu.com/s/1oubhQtEgr3suJe2lNCUoPQ 

提取码:hqyj

--来自百度网盘超级会员V6的分享

4. UI与耗时操作

在默认的情况下,程序员编写Qt程序只在一个线程(主线程)中运行。但是有时候这个线程会出现一些耗时操作(例如文件IO、网络、复杂算法等),这些耗时操作会导致主线程阻塞,此时用户发起的一些常规UI操作就无法得到及时的响应,此时操作系统检测一些关闭等UI操作无法及时响应则会弹出程序未响应窗口。

Windows等桌面操作系统会引导用户选择关闭还是等待。

解决方案就是使用多线程,主线程只执行UI相关操作,子线程执行耗时操作

5. QThread 线程类(掌握)

5.1 复现未响应

QThread类是Qt的线程类,其中有一个静态成员函数:

  • void QThread::msleep(unsigned long msecs) [static]

使当前线程强制睡眠,参数为睡眠时间,单位毫秒。

示例程序下载链接:百度网盘 请输入提取码

提取码:hqyj

--来自百度网盘超级会员V6的分享

5.2 创建并启动线程

创建并启动一个线程的步骤如下:

1. 在Qt Creator中选中项目名称后,鼠标右键,点击“添加新文件”。

2. 在弹出的窗口中,按照下图所示配置自定义线程类信息。

3. 在“项目管理”界面,直接点击“完成”。可以在项目中看到,线程类已经创建完成。

4. 在自定义线程类中,覆盖QThread类中的run函数。

void QThread::run() [virtual protected]

此函数是子线程的起始点,此函数执行完成后,子线程也执行结束。

5. 在run函数中编写子线程要执行的代码,此函数不能包含UI操作。

6. 在主线程中创建子线程类对象,并调用start函数启动子线程。

void QThread::start(Priority priority = InheritPriority) [slot]

参数为线程执行的优先级。

示例代码下载链接:百度网盘 请输入提取码

提取码:hqyj

--来自百度网盘超级会员V6的分享

5.3 优先级

不同的线程对象可以拥有不同的优先级,优先级代表cpu的一种选择偏向,具体取决于cpu对线程的调度。

除了使用start函数在启动时直接设置优先级外,当线程运行时,也可以使用下面的函数设置优先级;如果线程没有运行,此函数无效。

  • void QThread::setPriority(Priority priority)

参数为不同的优先级。

示例代码下载链接:百度网盘 请输入提取码

提取码:hqyj

--来自百度网盘超级会员V6的分享

5.4 线程停止

在实际的开发中尽量不要停止线程,本次提供两种停止的方式:

1. 调用terminate函数

void QThread::terminate() [slot]

强行停止线程执行

2. 给耗时操作循环体设置标志位,通过设置标志位的数值,停止循环,间接使run函数执行完毕,从而达到停止线程的效果。

示例代码下载链接:https://pan.baidu.com/s/1yx2Wq-GO3cM56lfviigmZQ 

提取码:hqyj

--来自百度网盘超级会员V6的分享

在上面的代码中,子线程执行了耗时操作(循环睡眠),主线程接收子线程操作的通知,在实际的开发中,主线程接收到子线程耗时操作的通知后可能会刷新UI显示(例如显示文件读写的进度),这种情况下需要使用信号槽进行两个线程之间的通信。

多线程文件拷贝器代码下载链接:https://pan.baidu.com/s/1SQLKqI7LP0EhkGZTzJJDUw 

提取码:hqyj

--来自百度网盘超级会员V6的分享

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值