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]