QT - 文件操作

在QT中,我们时常要对文件进行各种操作,比如文件的创建、写入、拷贝和删除等等,这些都要用到QFile类。

文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处理而开发的,所以文件读写是应用程序开发的一个基本功能。

Qt 提供了两种读写纯文本文件的基本方法:

用 QFile IODevice 读写功能直接进行读写

利用QFileQTextStream结合起来,用流(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();

在这个目录下生成临时文件和临时目录需要用到另外两个类: QTemporaryFileQTemporaryDir。就不展开介绍了,大家可以参考 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选项,以确保使用基于小部件的实现而不是原生对话框。

  1. 常用函数
    1. 静态方法

枚举

// 接受模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值