简述
QFileDialog提供了一个对话框用于选择文件或目录。
QFileDialog让用户可以遍历文件系统目录来选择文件或目录。
使用
创建一个QFileDialog最简单的方式是使用静态函数。如下所示:
fileName = QFileDialog::getOpenFileName(this, tr("选择一张图片"), "C:/Users/jiage/Desktop", tr("Image Files (*.png *.jpg *.bmp)"));
在上面的例子中,我们使用QFileDialog的静态函数创建了一个模态对话框。该对话框初始状态会显示"/home"目录中的内容,并且只会展示那些与字符串"Image Files (*.png *.jpg *.bmp)“所确定的模式想匹配的文件。对话框的父亲被设为this,并且窗口标题为"选择一张图片”,如下所示:

也可以不使用静态函数来创建文件QFileDialog,基本用法如下所示
QFileDialog dialog(this);
QStringList fileNames;
if (dialog.exec())
fileNames = dialog.selectedFiles();
常用接口
常用静态函数
使用QFileDialog最简单且方便的方法是通过它的静态函数,QFileDialog支持的静态函数如下:
函数名称 | 描述 |
---|---|
QString getExistingDirectory | 获取存在的文件夹的路径字符串 |
QUrl getExistingDirectoryUrl | 获取存在的文件夹的路径QUrl,与上面的不同之处在于,它可以获取远程文件夹。 |
QString getOpenFileName | 获取存在的文件的路径字符串 |
QStringList getOpenFileNames | 获取多个存在文件的路径字符串 |
QUrl getOpenFileUrl | 与getOpenFileName相似,不同之处在于,它支持远程文件选取。 |
QList<QUrl> getOpenFileNames | 与getOpenFileNames相似,不同之处在于,它支持远程文件选取。 |
QString getSaveFileName | 用于返回一个文件名,该文件不一定要存在 |
QUrl getSaveDirectoryUrl | 用于返回一个文件QUrl,该文件不一定要存在 |
常用设置
当使用静态函数创建对话框时,不能在该对话框执行过程中删除它的父亲。如果想要在对话框执行过程中删除它的父亲,我们应当使用QFileDialog构造函数来构造一个QFileDialog来使用。下面介绍一些常用设置。
打开模式设置
dialog.setAcceptMode(QFileDialog::AcceptMode mode);
一共有两种模式,如下所示:
常量 | 值 |
---|---|
QFileDialog::AcceptOpen | 0 |
QFileDialog::AcceptSave | 1 |
第一种将会以打开文件的形式展示对话框,第二种模式将会以保存文件的形式展示对话框。
设置默认后缀
dialog.setDefaultSuffic("txt");
在很多IDE中,我们保存文件的时候是不需要指定文件后缀的,因为IDE会自动帮我们添加后缀,该函数就是用来实现后缀自动添加
功能的。
设置打开目录
dialog.setDirectory(const QString &directory);
dialog.setDirectory(const QDir &directory);
dialog.setDirectoryUrl(const QUrl &directory);
用于设置对话框弹出时,所展示的目录。
设置文件模式
对话框的文件模式用户可以选择的条目类型与数量,可以设置的模式如下:
常量 | 值 | 描述 |
---|---|---|
QFileDialog::AnyFile | 0 | 返回文件名,无论该文件是否存在 |
QFileDialog::ExistingFile | 1 | 返回文件名,该文件必须存在 |
QFileDialog::Directory | 2 | 返回目录名,文件和目录都会展示出来,但原生Windows文件对话框不会在此模式下展示文件。 |
QFileDialog::ExistingFiles | 3 | 0或多个存在的文件名 |
设置方法如下:
dialog.setFileMode(QFileDialog::AnyFile);
设置过滤器
通过设置过滤器,我们可以指定哪些文件应当被显示出来。具体的选项如下所示:
常量 | 值 | 描述 |
---|---|---|
QDir::Dirs | 0x001 | 列出与过滤器相匹配的目录 |
QDir::AllDirs | 0x400 | 列出所有目录 |
QDir::Files | 0x002 | 列出文件 |
QDir::Drives | 0x004 | 列出磁盘驱动器,(在Unix下,该选项被忽略) |
QDir::NoSymLinks | 0x008 | 不列出符号链接(不支持符号链接的系统忽略此项) |
QDir::NoDotAndDotDot | NoDot | NoDotDot | 不列出特殊条目:".“和”…" |
QDir::NoDot | 0x2000 | 不列出特殊条目:"." |
QDir::NoDotDot | 0x4000 | 不列出特殊条目:"…" |
QDir::AllEntries | Dirs | Files | Drives | 列出目录,文件,磁盘,符号链接 |
QDir::Readable | 0x010 | 列出当前应用程序可读的文件 |
QDir::Writable | 0x020 | 列出当前应用程序可写的文件 |
QDir::Executable | 0x040 | 列出当前应用程序可以执行的文件 |
QDir::Modified | 0x080 | 只列出被修改过的文件 |
QDir::Hidden | 0x100 | 列出隐藏文件 |
QDir::System | 0x200 | 列出系统文件 |
QDir::CaseSensitive | 0x800 | 过滤器对大小写敏感 |
使用方法如下:
setFileter(QDir::Files);
设置过滤器匹配模式
dialog.setNameFilter("All C++ files (*.cpp *.cc *.C *.cxx *.c++)");
dialog.setNameFilter("*.cpp *.cc *.C *.cxx *.c++");
如果filter字符串包含一对括号,其中包含一个或多个文件名通配符模式,并用空格隔开,则仅将括号中包含的文本用作过滤器。所以,上面两种写法是等效的。
我们还可以同时设置多个过滤器,如下所示:
QStringList filters;
filters << "Image files (*.png *.xpm *.jpg)"
<< "Text files (*.txt)"
<< "Any files (*)";
QFileDialog dialog(this);
dialog.setNameFilters(filters);
设置浏览历史记录
在许多IDE中,当我们打开或者新建文件的时候,该IDE会默认打开我们上次打开过的目录,这就是历史记录所要实现的功能。使用方法如下:
QStringList historyList;
dialog.setHistory(historyList);
为文件对话框设置一个字符串列表用来存储浏览历史。
设置选项
setOption(QFileDialog::Option);
setOptions(QFileDialog::Options);
常用选项如下:
常量 | 值 | 描述 |
---|---|---|
QFileDialog::ShowDirsOnly | 0x00000001 | 只展示文件夹 |
QFileDialog::DontResolveSymlinks | 0x00000002 | 不解析符号链接 |
QFileDialog::DontConfirmOverwrite | 0x00000004 | 不要询问是否覆盖已经存在的文件,默认是询问的 |
QFileDialog::DontUseNativeDialog | 0x00000010 | 不要使用系统原生文件对话框。 |
引用
[1] Qt助手