在QT中,我们时常要对文件进行各种操作,比如文件的创建、写入、拷贝和删除等等,这些都要用到QFile类。
文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处理而开发的,所以文件读写是应用程序开发的一个基本功能。
Qt 提供了两种读写纯文本文件的基本方法:
用 QFile 类的 IODevice 读写功能直接进行读写
利用QFile和QTextStream结合起来,用流(Stream)的方法进行文件读写。
QFile类提供了读写文件的接口。一般情况下,我们可以直接在调用构造函数的时候传递文件名,这是比较方便的方法。或者使用QFile创建对象,再调用setFileName()方法来设置文件路径。其中文件名中的路径分隔符要求必须是'/',其他分隔符QFile不支持。
基本操作
常用接口
QFile构造函数:
QFile(const QString & name)
QFile(QObject * parent)
QFile(const QString & name, QObject * parent)
QFile的常用函数:
函数名 |
功能 |
copy() |
复制文件 |
exists() |
检查文件是否存在 |
open() |
打开文件 |
remove() |
删除文件 |
rename() |
修改文件名 |
setFileName() |
设置文件名 |
size() |
文件大小 |
pos() |
文件光标当前位置 |
seek() |
设置文件光标位置 |
atEnd() |
判断当前是否为文件尾 |
read() |
读取文件内容 |
close() |
关闭文件 |
文件打开模式:
模式 |
值 |
描述 |
QIODevice::NotOpen |
0x0000 |
不打开 |
QIODevice::ReadOnly |
0x0001 |
只读方式 |
QIODevice::WriteOnly |
0x0002 |
只写方式,如果文件不存在则会自动创建文件 |
QIODevice::ReadWrite |
ReadOnly |WriteOnly |
读写方式 |
QIODevice::Append |
0x0004 |
此模式表明所有数据写入到文件尾 |
QIODevice::Truncate |
0x0008 |
打开文件之前,此文件被截断,原来文件的所有数据会丢失 |
QIODevice::Text |
0x0010 |
读的时候,文件结束标志位会被转为’\n’;写的时候,文件结束标志位会被转为本地编码的结束为,例如win32的结束位’\r\n’ |
QIODevice::UnBuffered |
0x0020 |
不缓存 |
创建并打开文件
//初始化时加载文件路径 QFile file("F:/test/xxx.txt"); //以读写的方式打开文件,成功返回true,失败返回false //想用其他方式打开文件,请看上面的文件打开模式 bool ok = file.open(QIODevice::ReadWrite); //如果文件不存在,则创建并打开该文件 |
判断文件是否存在
//判断指定文件是否存在.也可以用来判断在指定路径下是否有文件和你将要创建的文件重名. //存在返回true,不存在返回false bool exist = QFile::exists("F:/test/xxx.txt"); |
拷贝文件
//把D盘里的xxx.txt拷贝到到F盘,命名为sss.txt //拷贝成功返回true,失败返回false bool ok = QFile::copy("D:/xxx.txt", "F:/sss.txt"); |
给文件重命名
QFile file("F:/xxx.txt"); bool ok = file.rename("F:/sss.txt"); //重命名成功返回true,失败返回false //也可以直接调用 bool ok = QFile::remove("F:/xxx.txt", "F:/sss.txt"); |
获取用户对指定文件的权限,是否可读
QFlags<QFileDevice::Permission> power = QFile::permissions("F:/xxx.txt"); //判断文件所有者是否可读 if (power.testFlag(QFile::ReadOwner)) qDebug("Can Read!"); |
写入文件
//定义文件内容字符串 QString str= "写入文件的内容"; QFile file("F:/xxx.txt"); //打开文件,不存在则创建 file.open(QIODevice::ReadWrite | QIODevice::Text); //写入文件需要字符串为QByteArray格式 file.write(str.toUtf8()); file.close(); |
读取文件数据
//先打开文件 QFile file("F:/xxx.txt"); file.open(QIODevice::ReadOnly | QIODevice::Text); //使用QTextStream一行一行读取文件 QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); //整行读取 qDebug() << line; } |
删除文件
QFile file("F:/xxx.txt"); bool ok = file.remove(); //删除成功返回true,失败返回false //也可以直接调用 bool ok = QFile::remove("F:/xxx.txt"); |
获取文件夹下所有文件
QDir *dir = new QDir("F:/"); QStringList filters; filters << "*.png" << "*.jpg" << "*.bmp"; //过滤器,过滤你想要的文件后缀 //用链表保存过滤的文件名 QList<QFileInfo> *fileInfo = new QList<QFileInfo>(dir->entryInfoList(filters)); //获取文件数目、文件名称 for(int i = 0; i < fileInfo->count(); i++) { //QFileInfo(路径名的Qstring字符串).filename可以直接取到路径中的文件名 qDebug() << fileInfo->at(i).fileName(); } |
判断文件夹是不是存在
QString fullPath; //文件夹全路径 bool isDirExist(QString fullPath) /*方法1*/ { QDir dir(fullPath); if(dir.exists()) { return true; } return false; } bool isDirExist(QString fullPath) /*方法2*/ { QFileInfo fileInfo(fullPath); if(fileInfo.isDir()) { return true; } return false; } |
判断文件是不是存在
QString fullFileName; //文件全路径(包含文件名) bool isFileExist(QString fullFileName) { QFileInfo fileInfo(fileFullName); if(fileInfo.isFile()) { return true; } return false; } |
准确判断文件是否存在
/*方法1*/ bool isDirExist(QString fullPath) { QDir dir(fullPath); if(dir.exists()) { return true; } else { bool ok = dir.mkdir(fullPath); //只创建一级子目录,即必须保证上级目录存在 return ok; } } /*方法2*/ bool isDirExist(QString fullPath) { QDir dir(fullPath); if(dir.exists()) { return true; } else { QDir dir1; bool ok = dir1.mkpath(fullPath); //创建多级目录 return ok; } } |
准确判断文件是否存在 用QFileInfo::isFile()方法 准确判断文件夹是否存在 用QFileInfo::isDir()方法 用QDir::exists()方法 不确定字符串是文件还是文件夹路径 用QFileInfo::exists()方法 用QFile::exists()方法 |
获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法
#pragma once #include <QApplication> #include <QDir> #define IMAGE_PATH(name) QApplication::applicationDirPath() + QDir::separator() +"image" +QDir::separator() +name #define DATA_FILE_PATH(name) QApplication::applicationDirPath() + QDir::separator()+"data"+QDir::separator()+name #define DATA_MODIFY_PATH(name) QApplication::applicationDirPath() + QDir::separator()+"data"+QDir::separator()+"ModifySpro"+QDir::separator()+name #define DATA_REMOVE_GEAR_PATH(name) QApplication::applicationDirPath() + QDir::separator()+"data"+QDir::separator()+"RemoveGear"+QDir::separator()+name #define APP_STYLE QApplication::applicationDirPath() + QDir::separator()+ "style.css" #define MODEL_GROUP QApplication::applicationDirPath() + QDir::separator()+ "groupInfo" #define APP_CONFIG QApplication::applicationDirPath() + QDir::separator()+ ".config" #define DATA_BASE_PATH QApplication::applicationDirPath() + QDir::separator()+ "database" #define IMPSPRO_PATH QApplication::applicationDirPath() + QDir::separator()+ "config/impspro.txt" #define min(a,b) ((a)<(b)? (a) :(b)) #define max(a,b) ((a)>(b)? (a) :(b)) |
程序所在路径
获取程序所在路径,QCoreApplication 类里就实现了相关的功能:
QString QCoreApplication::applicationDirPath() |
比如我们有一个程序在:
C:/Qt/examples/tools/regexp/regexp.exe
那么 qApp->applicationDirPath() 的结果是:
C:/Qt/examples/tools/regexp
如果除了程序所在路径,我们还想要程序的完整名称。那么可以这么写:
qApp->applicationFilePath()
还是上面的例子,结果是:
C:/Qt/examples/tools/regexp/regexp.exe
当前工作目录
QDir 提供了一个静态函数 currentPath() 可以获取当前工作目录,函数原型如下:
QString QDir::currentPath() |
如果我们是双击一个程序运行的,那么程序的工作目录就是程序所在目录。
如果是在命令行下运行一个程序,那么运行程序时在命令行的哪个目录,那个目录就是当前目录。
用户目录路径
Qt 4 中的方法。下面的方法只对 Qt 4 有效,Qt 5 已经删除了 storageLocation() 方法。
QDesktopServices::storageLocation(QDesktopServices::HomeLocation); |
Qt 5 中引入的方法。
QStandardPaths::writableLocation(QStandardPaths::HomeLocation); |
或者
QStandardPaths::standardLocations(QStandardPaths::HomeLocation); |
这两个方法的区别是 standardLocations() 返回值是 QStringList。当然对于 HomeLocation 来说这个 QStringList 中只有一个 QString。
还有另外一种方法,利用 QDir 类的一个静态函数:
QDir::homePath(); |
我的文档路径
Qt 4 中的方法。下面的方法只对 Qt 4 有效,Qt 5 已经删除了 storageLocation() 方法。
QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); |
Qt 5 中引入的方法。
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation); |
桌面路径
Qt 4 中的方法。下面的方法只对 Qt 4 有效,Qt 5 已经删除了 storageLocation() 方法。
QDesktopServices::storageLocation(QDesktopServices::DesktopLocation); |
Qt 5 中引入的方法。
QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QStandardPaths::standardLocations(QStandardPaths::DesktopLocation); |
程序数据存放路径
通常我们会将程序所需的一些数据存入注册表。但是有时需要存储的数据太多,放在注册表中就不适合了。这时我们就要找个专门的地方来放数据。以前我喜欢将数据直接放到程序所在目录,但是后来发现我的程序运行时经常没有权限对这个目录下的文件进行写操作。后来发现其实 Qt 早就替我们考虑过这些问题了。
Qt 4 中的方法。下面的方法只对 Qt 4 有效,Qt 5 已经删除了 storageLocation() 方法。
QDesktopServices::storageLocation(QDesktopServices::DataLocation); |
Qt 5 中引入的方法。
QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); |
Qt 5.5 中引入了另一种方法:
QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); QStandardPaths::standardLocations(QStandardPaths::AppConfigLocation); |
这个方法一般来说和上面的方法得到的结果是相同的。按照 Qt 帮助文档的解释,这个方法可以确保返回的路径非空。所以我认为应该优先选用这个方法。
临时文件路径
Qt 4 中的方法。下面的方法只对 Qt 4 有效,Qt 5 已经删除了 storageLocation() 方法。
QDesktopServices::storageLocation(QDesktopServices::TempLocation); |
Qt 5 中引入的方法。
QStandardPaths::writableLocation(QStandardPaths::TempLocation); QStandardPaths::standardLocations(QStandardPaths::TempLocation); |
更传统的方法是利用 QDir 的一个静态函数 tempPath()。
QDir::tempPath();
在这个目录下生成临时文件和临时目录需要用到另外两个类: QTemporaryFile 和 QTemporaryDir。就不展开介绍了,大家可以参考 qt 的帮助文档。
至此,常用的各种特殊路径就介绍的差不多了。剩下还有些不常用的,可以参考 QStandardPaths 类的介绍。
示例
二进制文件读操作:把写进去的数据读出来
//创建文件 对象 QFile file("../test.txt"); bool isok = file.open(QIODevice::ReadOnly); if(isok == true) { QDataStream stream(&file); //读取数据时 按照写入的顺序读取 QString str; int a; stream >> str >>a ; cout << str.toUtf8().data() << a; } |
二进制文件写操作:
//创建文件 对象 QFile file("../test.txt"); bool isok = file.open(QIODevice::WriteOnly); if(isok == true) { //创建数据流,和file文件关联起来,向数据流里面输入数据时,就是往文件里面写数据 QDataStream stream(&file); //stream 是二进制的数据,在文本显示为乱码 stream << QString("主要看气质") << 250; file.close(); } |
//获取文件信息 QfileInfo info(path); qDebug()<<"文件名字:"<< info.fileName(); qDebug()<<"文件后缀:"<< info.suffix(); qDebug()<<"文件大小:"<< info.size(); qDebug()<<"文件创建时间:"<< info.created().toString("yyyy-MM-dd hh:mm:ss"); |
void Widget::on_btn_read_clicked() { QString path = QFileDialog::getOpenFileName(this,"打开","../"); if(path.isEmpty() == false) { //创建文件对象 QFile file(path); bool isok = file.open(QIODevice::ReadOnly); //只读模式打开 if(isok == true) { #if 1 //读文件 QByteArray array = file.readAll(); //将数据写进文本框中 ui->textEdit->setText(QString(array)); #else //一行一行的读 QByteArray array; while(file.atEnd() == false) { array += file.readLine(); } ui->textEdit->setText(QString(array).toUtf8().data()); #endif } file.close(); //获取文件信息 QFileInfo info(path); qDebug()<<"文件名字:"<< info.fileName(); qDebug()<<"文件后缀:"<< info.suffix(); qDebug()<<"文件大小:"<< info.size(); qDebug()<<"文件创建时间:"<< info.created().toString("yyyy-MM-dd hh:mm:ss"); //yyyy代表年 MMd } } |
读文件跟写文件差不多,这里我们主要说一下,如果我们需要文件的相关信息,比如路径,大小,格式等。并不是去索引这个文件路径然后获取相关信息。在qt中有一个QFileInfo的类,他有很多的函数 是用来获取文本信息的。例如:
isDir() 检查该文件是否是目录;
isExecutable() 检查该文件是否是可执行文件等。
baseName() 可以直接获得文件名;
completeBaseName() 获取完整的文件名
suffix() 则直接获取文件后缀名。
completeSuffix() 获取完整的文件后缀
#include <QFileInfo>
QFileInfo fileInfo(PATH); //绝对路径与相对路径都可以
QString absolute_path = fileInfo.absoluteDir(); //包含文件名的绝对路径
QString absolute_path_without_filename1 = fileInfo.absoluteDir().path(); //不包含文件名的绝对路径
QString absolute_path_without_filename2 = fileInfo.absolutePath(); //不包含文件名的绝对路径
QString filename = fileInfo.fileName(); //包含后缀的文件名
QString filename_without_suffix = fileInfo.baseName(); //不包含后缀的文件名
QString suffix = fileInfo.suffix(); //文件的后缀名
QFileDialog使用
只获取文件夹 : QString file_name = QFileDialog::getExistingDirectory(NULL,"caption",".");
描述
QFileDialog类提供了一个对话框,允许用户选择文件或目录。
QFileDialog类使用户能够遍历文件系统以选择一个或多个文件或目录。
创建QFileDialog最简单的方法是使用静态函数。
fileName = QFileDialog::getOpenFileName(this,tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)")); |
在上面的示例中,使用静态函数创建了一个模态的QFileDialog。对话框最初显示“/home/jana”目录的内容,并显示与字符串"Image Files (*.png *.jpg *.bmp)"中给定的模式匹配的文件。文件对话框的父级设置为this,窗口标题设置为"Open Image"。
如果想使用多个过滤器,使用两个分号分隔每个过滤器。例如: "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" |
您可以在不使用静态函数的情况下创建自己的QFileDialog。通过调用setFileMode(),可以指定用户在对话框中必须选择的内容:
QFileDialog dialog(this); dialog.setFileMode(QFileDialog::AnyFile); |
在上面的示例中,文件对话框的模式设置为AnyFile,意味着用户可以选择任意文件甚至可以指定不存在的文件。这种模式对于"Save As" 文件对话框很有用。如果用户必须选择现有文件,则使用ExistingFile;如果只能选择目录,则使用Directory。
fileMode属性包含对话框的操作模式;这表示用户预期选择的对象类型。使用setNameFilter()设置对话框的文件过滤器。例如:
dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg)")); |
在上面的示例中,过滤器设置为"Images (*.png *.xpm *.jpg)",这意味着只扩展名为png、xpm或jpg的文件将显示在QFileDialog中。您可以使用setNameFilters()应用多个过滤器。使用selectNameFilter()来选择一个过滤器作为文件对话框的默认过滤器。
文件对话框有两种视图模式:列表和详细信息。列表以文件和目录名称列表的形式显示当前目录的内容。详细信息也显示文件和目录名称的列表,但在每个名称旁边提供更多信息,比如文件大小和修改日期。使用setView()设置模式:
dialog.setViewMode(QFileDialog::Detail); |
创建自己的文件对话框时,还需要使用selectedFiles()函数。
QStringList fileNames; if (dialog.exec()) fileNames = dialog.selectedFiles(); |
在上面的示例中,创建并显示了一个模态文件对话框。如果用户点击了确定,所选文件将放在fileNames中。
可以使用setDirectory()设置对话框的工作录。使用selectFile()函数可以选择当前录中的每个文件。
标准对话框示例展示了如何使用QFileDialog以及其他内置的Qt对话框。
默认情况下,如果平台有原生的文件对话框,将使用它。在这种情况下,用于构建对话框的小部件将不会被实化,因此相关的访问器(例如layout()和itemDelegate())将返回null。您可以设置DontUseNativeDialog选项,以确保使用基于小部件的实现而不是原生对话框。
- 常用函数
- 静态方法
枚举 // 接受模式 enum AcceptMode { AcceptOpen, AcceptSave } // 文本 enum DialogLabel { LookIn, FileName, FileType, Accept, Reject } // 文件模式 enum FileMode { AnyFile, ExistingFile, Directory, ExistingFiles, DirectoryOnly } // 选项 enum Option { ShowDirsOnly, DontResolveSymlinks, DontConfirmOverwrite, DontUseNativeDialog, ..., DontUseCustomDirectoryIcons } // 标志 flags Options // 视图 enum ViewMode { Detail, List } |
// 获取已存在目录 QString getExistingDirectory(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &dir = QString(), Options options = ShowDirsOnly) // 获取已存在目录Url QUrl getExistingDirectoryUrl(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QUrl &dir = QUrl(), Options options = ShowDirsOnly, const QStringList &supportedSchemes = QStringList()) // 获取打开的文件 QString getOpenFileName(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options()) // 获取打开的文件列表 QStringList getOpenFileNames(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options()) // 获取打开的文件Url QUrl getOpenFileUrl(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options(), const QStringList &supportedSchemes = QStringList()) // 获取打开的文件Url列表 QList<QUrl> getOpenFileUrls(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options(), const QStringList &supportedSchemes = QStringList()) // 获取保存的文件 QString getSaveFileName(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options()) // 获取保存的文件Url QUrl getSaveFileUrl(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QUrl &dir = QUrl(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options(), const QStringList &supportedSchemes = QStringList()) |
公有成员方法
acceptMode():获取文件对话框的接受模式。这决定了用户选择文件后,哪些文件会被接受并返回。可能的值包括:QFileDialog::AnyFile, QFileDialog::ExistingFile, QFileDialog::DirectoryOnly。 defaultSuffix():获取文件对话框的默认后缀。如果用户没有输入文件名,那么会使用这个后缀。 directory():获取文件对话框当前显示的目录。 directoryUrl():获取文件对话框当前显示的目录的URL。 fileMode():获取文件对话框的文件模式。这决定了对话框是用于打开文件还是创建新文件。可能的值包括:QFileDialog::AnyFile, QFileDialog::ExistingFile, QFileDialog::Directory, QFileDialog::DirectoryOnly。 filter():获取文件对话框的过滤器设置。这些过滤器用于限制用户可以选择哪些类型的文件。 history():获取文件对话框的历史记录。这些记录包含了用户之前访问过的目录。 iconProvider():获取文件对话框的图标提供器。这个提供器用于提供文件和目录的图标。 itemDelegate():获取文件对话框的项目代理。这个代理用于绘制和编辑文件和目录的条目。 labelText(DialogLabel label):获取给定标签的标签文本。 mimeTypeFilters():获取文件对话框的MIME类型过滤器。这些过滤器用于限制用户可以选择哪些类型的文件。 nameFilters():获取文件对话框的名称过滤器。这些过滤器用于限制用户可以选择哪些类型的文件或目录。 open(QObject *receiver, const char *member):打开文件对话框,并在用户选择了一个文件或目录后,发送一个信号给指定的接收器。 options():获取文件对话框的选项。这些选项可以控制对话框的行为。 proxyModel():获取文件对话框的代理模型。这个模型用于组织和过滤目录中的项目。 restoreState(const QByteArray &state):尝试从给定的状态字节数组中恢复文件对话框的状态。如果成功,返回true;否则返回false。 saveState():返回一个包含当前文件对话框状态的字节数组。这个状态可以用于以后恢复对话框的状态。 void selectFile(const QString &filename): 选择指定的文件进行打开或保存。 void selectMimeTypeFilter(const QString &filter): 设置MIME类型过滤器,用于限制用户可以选择哪些类型的文件。 void selectNameFilter(const QString &filter): 设置名称过滤器,用于限制用户可以选择哪些类型的文件或目录。 void selectUrl(const QUrl &url): 选择指定的URL进行打开或保存。 QStringList selectedFiles() const: 返回用户选择的文件列表。 QString selectedMimeTypeFilter() const: 返回用户选择的MIME类型过滤器。 QString selectedNameFilter() const: 返回用户选择的名称过滤器。 QList<QUrl> selectedUrls() const: 返回用户选择的URL列表。 void setAcceptMode(AcceptMode mode): 设置文件对话框的接受模式,如QFileDialog::AnyFile, QFileDialog::ExistingFile, QFileDialog::DirectoryOnly等。 void setDefaultSuffix(const QString &suffix): 设置默认的后缀,如果用户没有输入文件名,那么会使用这个后缀。 void setDirectory(const QString &directory): 设置文件对话框当前显示的目录。 void setDirectory(const QDir &directory): 与上一个函数相同,设置文件对话框当前显示的目录。 void setDirectoryUrl(const QUrl &directory): 设置文件对话框当前显示的目录的URL。 void setFileMode(FileMode mode): 设置文件对话框的文件模式,如QFileDialog::AnyFile, QFileDialog::ExistingFile, QFileDialog::Directory, QFileDialog::DirectoryOnly等。 void setFilter(QDir::Filters filters): 设置文件对话框的过滤器设置,用于限制用户可以选择哪些类型的文件。 void setHistory(const QStringList &paths): 设置文件对话框的历史记录,这些记录包含了用户之前访问过的目录。 void setIconProvider(QFileIconProvider *provider): 设置文件对话框的图标提供器,用于提供文件和目录的图标。 void setItemDelegate(QAbstractItemDelegate *delegate): 设置文件对话框的项目代理,用于绘制和编辑文件和目录的条目。 void setLabelText(DialogLabel label, const QString &text): 设置给定标签的标签文本。 void setMimeTypeFilters(const QStringList &filters): 设置文件对话框的MIME类型过滤器,用于限制用户可以选择哪些类型的文件。 void setNameFilter(const QString &filter): 设置文件对话框的名称过滤器,用于限制用户可以选择哪些类型的文件或目录。 void setNameFilters(const QStringList &filters): 与上一个函数相同,设置文件对话框的名称过滤器。 void setOption(Option option, bool on = true): 设置文件对话框的选项,可以控制对话框的行为。 void setOptions(Options options): 与上一个函数相同,设置文件对话框的选项。 void setProxyModel(QAbstractProxyModel *proxyModel): 设置文件对话框的代理模型,用于组织和过滤目录中的项目。 void setSidebarUrls(const QList<QUrl> &urls): 设置文件对话框的侧边栏URL列表。 void setSupportedSchemes(const QStringList &schemes): 设置文件对话框支持的URL方案列表。 void setViewMode(ViewMode mode): 设置文件对话框的视图模式。 QList<QUrl> sidebarUrls() const: 返回文件对话框的侧边栏URL列表。 QStringList supportedSchemes() const: 返回文件对话框支持的URL方案列表。 bool testOption(Option option) const: 测试文件对话框是否具有指定的选项。 ViewMode viewMode() const: 返回文件对话框的视图模式。 |
使用场景
打开文件:用户可以使用QFileDialog打开一个或多个文件,以便读取文件内容或操作文件数据。 保存文件:用户可以使用QFileDialog选择保存文件的目标路径和文件名,并将数据写入该文件。 选择文件夹:QFileDialog也可以用于选择文件夹路径,而不是具体的文件。 文件过滤:可以使用QFileDialog设置文件过滤器,限制用户只能选择特定类型的文件,以便过滤掉不支持的文件类型。 历史路径:QFileDialog可以保存用户最近打开或保存的文件,以便在下次打开对话框时提供快速访问。 自定义UI:QFileDialog提供了许多可自定义的选项,可以根据需要调整对话框的外观和行为,以匹配应用程序的需求。 |
QFileInfo简介
以下是一些常见的 QFileInfo 属性及其含义:
fileName():返回文件名(不包括路径);
filePath():返回完整文件路径;
size():返回文件大小(以字节为单位);
created():返回文件创建时间;
lastModified():返回最后修改时间;
isDir():判断该对象所表示的是否是一个目录(如果是,则返回 true;否则返回 false)。
QFileInfo类为我们提供了系统无关的文件信息,包括文件的名字和在文件系统中位置,文件的访问权限,是否是目录或符合链接等等。并且,通过这个类,可以修改文件的大小和最后修改、读取时间。同时,QFileInfo类也可以用来取到Qt 资源的相关信息。
QFileInfo可以表示绝对路径或相对路径的文件。其中,绝对路径就是以"/"开始的路径(或者在Windows系统上就是以某个盘符开始的路径)。相对路径就是相对于当前工作目录的一个文件或目录。我们在开发中可以使用该类的成员函数isRelative() 来判断一个QFileInfo表示的是一个相对路径还是一个绝对路径,也可以使用makeAbsolute()将一个相对路径转换为一个绝对路径。
可以使用exists() 函数判断一个文件是否存在,使用size()函数获取文件的大小。成员函数isFile()、isDir()、isSymLink() 可以判断文件的类型(普通文件、目录或是符号链接)。
若QFileInfo当前代表的是一个符号链接,symLinkTarget() 函数返回符号链接所指向的文件。在Unix平台上,包括macOS和iOS,符号链接和它所指向的文件具有同样的大小,因为Unix透明的看待普通文件和符号链接;同样,打开一个符号链接进行读写时,其实是打开了它所指向的真实文件。例如:
#ifdef Q_OS_UNIX QFileInfo info1("/home/bob/bin/untabify"); info1.isSymLink(); // returns true info1.absoluteFilePath(); // returns "/home/bob/bin/untabify" info1.size(); // returns 56201 info1.symLinkTarget(); // returns "/opt/pretty++/bin/untabify" QfileInfo info2(info1.symLinkTarget()); info2.isSymLink(); // returns false info2.absoluteFilePath(); // returns "/opt/pretty++/bin/untabify" info2.size(); // returns 56201 #endif |
在Windows平台上,符号链接是 .lnk 文件,也就是快捷方式。此时,size() 函数返回的是符号链接本身的大小,同样,打开一个 .lnk 文件就是打开 .lnk 文件本身,并不是打开它所指向的真实文件。例如:
#ifdef Q_OS_WIN QFileInfo info1("C:\\Documents and Settings\\Bob\\untabify.lnk"); info1.isSymLink(); // returns true info1.absoluteFilePath(); // returns "C:/Documents and Settings/Bob/untabify.lnk" info1.size(); // returns 743 info1.symLinkTarget(); // returns "C:/Pretty++/untabify" QFileInfo info2(info1.symLinkTarget()); info2.isSymLink(); // returns false info2.absoluteFilePath(); // returns "C:/Pretty++/untabify" info2.size(); // returns 63942 #endif |
扩展
若QFileInfo代表的是目录,则QFileInfo不会自动在路径后添加一个"/"。如果你需要这个"/",需要自己手动添加。
在NTFS文件系统上,特别是Windows,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的。要使能这个功能,可以在文件中添加下面这行代码:
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; |
这样一来,我们可以方便的通过递增或递减这个变量使能或禁用权限检查功能:
qt_ntfs_permission_lookup++; // turn checking on qt_ntfs_permission_lookup--; // turn it off again |