目录
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的分享