在很多软件中都有打开某个路径下文件的需求,刚刚开始对于新人来说,可能会有疑问这里是不是还要自己写一个文件对话框,用来展示和获得文件路径;很显然Qt自身就给你提供了这样的构件,直间调用就可以实现。
QFileDialog:
提供了允许用户选择文件或者目录的对话框。 其父类为 QDialog
参考之前QMessageBox的例子:
1、使用QFileDialog可以直接调用其静态公有函数
2、使用自定义的函数构造对话框的各个细节
方案一:
根据帮助文档提供的线索,看一下各个静态的公有函数是跟什么用的:
(1)
getExistingDirectory
只获取文件夹
(2)
getExistingDirectoryUrl
和getExistingDirectory类似,功能也是获取文件夹路径,最大的区别在于参数里的路径是QUrl类型,这为用户提供了选择远程目录的能力。
(3)
getOpenFileName
获取本地文件
(4)getOpenFileUrl
获取远程文件,为用户提供了获取远程文件路径的能力
(5)
getOpenFileUrls
获取多个远程文件,可以得到多个远程文件路径
(6)getOpenFileNames
获取多个本地文件
(7)getSaveFileName 保存本地文件对话框
(8)getSaveFileUrl 保存远程文件对话框
方案二:
先构造一个QFileDialog对象:
QFileDialog fd;
- 设置是打开还是保存文件对话框 AcceptMode(2个枚举)
fd.setAcceptMode(QFileDialog::AcceptOpen);
//文件对话框为打开类型
fd.setAcceptMode(QFileDialog::AcceptSave);
//文件对话框为保存类型
- 设置对话框显示信息的详细程度(2个枚举)
fd.setViewMode(QFileDialog::Detail);
//详细
fd.setViewMode(QFileDialog::List);
//仅列表
- 设置点击OK后,对话框返回什么(4个枚举)
fd.setFileMode(QFileDialog::AnyFile);
//文件名,无论是否存在
fd.setFileMode(QFileDialog::ExistingFile);
//存在的,单个文件名
fd.setFileMode(QFileDialog::Directory);
//文件夹名
fd.setFileMode(QFileDialog::ExistingFiles);
//多文件
- 设置标题
fd
.setWindowTitle
(
"标题"
)
;
- 设置默认后缀
fd
.setDefaultSuffix
(
"txt"
)
;
上面除了还有个Option没写以外,其他都是Properties,下面开始讲公共函数。
- 获取对话框中的目录地址
QDir
dir
= fd.directory();qDebug() <<
dir
;
//如果要获取远程目录,则用QDir dir = fd.directoryUrl();
- 设置QDir::filter过滤器
fd
.setFilter
(QDir::AllDirs)
;
qDebug() << fd
.filter
()
;
这里的QDir::filter过滤器和对话框右下角(*.txt)过滤器不一样,QDir::filter过滤器有16个枚举,如下:
Constant | Value | Description |
QDir::Dirs | 0x001 | 列出匹配filters的目录 |
QDir::AllDirs | 0x400 | 列出所有目录 |
QDir::Files | 0x002 | 列出所有文件 |
QDir::Drives | 0x004 | 列出磁盘驱动器(Unix系统忽略) |
QDir::NoSymLinks | 0x008 | 不列出符号连接 |
QDir::NoDotAndDotDot | NoDot or NoDotDot | 不列出特殊条目,如“.”或者“..” |
QDir::NoDot | 0x2000 | 不列出“.” |
QDir::NoDotDot | 0x4000 | 不列出“..” |
QDir::AllEntries | Dirs\Files\Drives | 列出目录、驱动盘、符号连接 |
QDir::Readable | 0x010 | 列出程序有读权限的文件。可读值需配合Dirs和Files |
QDir::Writable | 0x020 | 列出程序有写权限的文件。可读值需配合Dirs和Files |
QDir::Executable | 0x040 | 列出程序有运行权限的文件。可读值需配合Dirs和Files |
QDir::Modified | 0x080 | 只列出已修改的文件(Unix系统忽略) |
QDir::Hidden | 0x100 | 列出隐藏文件(Unix系统以“.”开头) |
QDir::System | 0x200 | 列出系统文件 |
QDir::CaseSensitive | 0x800 | 过滤器应区分大小写 |
- 返回文件图标提供者
QFileIconProvider * QFileDialog::iconProvider() const
这个就是关于文件等图标的函数,用这个函数可以获得是谁提供了这些图标的。当然系统图标也可以自己设置。
- 返回委托
QAbstractItemDelegate * QFileDialog::itemDelegate() const
返回列表项目的delegate(委托),这些委托用来提供对话框视图中的项目。
- 设置对话框中的文字标签
在对话框中可以设置的文字标签共有5处,如下图:
- 设置多个对话框右下角的文件过滤器
QStringList filters;filters <<
"Image files (*.png *.xpm *.jpg)"
<<
"Text files (*.txt)"
<<
"Any files (*)"
;fd.setNameFilters(filters);
//就是这个函数咯
例程:
myfiledialogdemo.CPP 文件:
#include "myfiledialogdemo.h"
#include <QPushButton>
#include <QFileDialog>
#include <QDebug>
#include <QStringList>
MyFileDialogDemo::MyFileDialogDemo(QWidget *parent) :
QWidget(parent)
{
QPushButton* pBtn = new QPushButton("OPen", this);
QPushButton* pBtns = new QPushButton("打开多个", this);
QPushButton* pBtnDir = new QPushButton("打开文件夹", this);
QPushButton* pBtn1 = new QPushButton("打开自定义",this);
pBtn->setGeometry(0,40,80,25);//前两个参数时坐标,后两个参数是宽,长
pBtns->setGeometry(100, 40, 80, 25);
pBtnDir->setGeometry(0, 0, 90, 25);
pBtn1->setGeometry(100, 0, 90, 25);
connect(pBtn, &QPushButton::clicked,
[=]()
{
//静态公有函数实现
QString strPath = QFileDialog::getOpenFileName(NULL,
QString("Open"),
QString("../../"),
tr("image(*.png *.jpg);;souce(*.h *.cpp);;Text(*.txt);;all(*.*)")//过滤文件格式
);
qDebug()<<strPath;
}
);
connect(pBtns, &QPushButton::clicked, this, &MyFileDialogDemo::slotFileDemo1);
connect(pBtnDir, &QPushButton::clicked, this, &MyFileDialogDemo::slotFileDemo2);
connect(pBtn1, &QPushButton::clicked, this, &MyFileDialogDemo::slotFileDemo3);
}
MyFileDialogDemo::~MyFileDialogDemo()
{
}
void MyFileDialogDemo::slotFileDemo1()
{
QStringList filePaths = QFileDialog::getOpenFileNames(this,
"open",
"../../",
tr("Text(*.txt *.h *.cpp);; Image(*.jpg *.png *.icon)")
);
int count = filePaths.length();
for(int i = 0; i < count; i++ )
{
qDebug()<<filePaths.at(i);
}
}
void MyFileDialogDemo::slotFileDemo2()
{
QString dirPath = QFileDialog::getExistingDirectory(this,
QString(tr("打开文件夹")),
QString("../")
);
qDebug()<<dirPath;
}
void MyFileDialogDemo::slotFileDemo3()
{
//自定义
QFileDialog fd;
QStringList filters;
filters << "Image files (*.png *.xpm *.jpg)"
<< "Text files (*.txt)"
<< "Any files (*)";
fd.setNameFilters(filters);//就是这个函数咯
fd.setAcceptMode(QFileDialog::AcceptOpen);
fd.setViewMode(QFileDialog::Detail);
fd.setFileMode(QFileDialog::AnyFile);//对话框返回值
fd.setWindowTitle("open");
fd.exec();
}
myfiledialogdemo
.h:
#ifndef MYFILEDIALOGDEMO_H
#define MYFILEDIALOGDEMO_H
#include <QWidget>
class MyFileDialogDemo : public QWidget
{
Q_OBJECT
public:
explicit MyFileDialogDemo(QWidget *parent = 0);
~MyFileDialogDemo();
void slotFileDemo1();//QT5中槽函数可以是普通函数不需要用关键字修饰
private slots:
void slotFileDemo2();//Qt4中需要被slots关键字修饰
void slotFileDemo3();
};
#endif // MYFILEDIALOGDEMO_H
写在最后欢迎大家指正,一起交流学习:QQ:1106594334