QFileSystemModel为本机的文件系统提供了一个模型,结合使用QFileSystemModel和QTreeView,可以以目录树的形式显示本机文件系统,如同Windows的资源管理器一样,使用QFileSystemModel提供的接口函数,我们可以创建目录,删除目录,重命名目录,可以获取文件名称,目录名称,,文件大小等,还可以获取文件的详细信息。要通过QFileSystemModel获取本机文件系统,需要使用QFIleSystemModel的函数setRootPath()设置一个根目录,例如:
QFIleSystemModel* model=new QFIleSystemModel(this);
model->setRootPath(QDir::currentPath()); //设置应用程序的当前目录为模型的根目录
使用QFIleSystemModel作为模型以及QTreeView,QListView,QTableView作为主要组件而设计的示例运行时界面如下图所示。
QFIleSystemModel类
QFIleSystemModel为本机的文件系统提供一个模型,可以用于访问本机的文件系统,它提供了一些接口函数,这些接口函数可以设置显示选项,获取文件信息,以及创建或删除文件夹等,
1,设置根目录
函数setRootPath()设置一个根目录,QFIleSystemModel模型就只显示这个根目录下的文件系统。
QModelIndex setRootPath(const QString &newPath)
有两个函数用于返回QFIleSystemModel的当前根目录
QDir rootDirectory() //以QDir类型返回当前模型的根目录
QString rootPath() //以QString类型返回当前模型的根目录
用函数index ()可以根据完整的目录或文件名字符串,返回目录或文件系统模型中的模型索引。
QModelIndex index(const QString &path ,int column=0) //返回目录或文件的模型索引
2,设置模型选项
(1),模型项的过滤器,函数setFilter()用于设置一个过滤器,以控制QFIleSystemModel模型包含的文件系统的项的类型,例如是否显示文件,是否显示隐藏文件等,其函数原型如下
void setFilter(QDir::Filters filters) //设置模型数据项过滤器
参数filters是标志类型,是枚举类型QDir::Filter的枚举值组合。QDir::Filter的常见枚举值如下:
QDir::AllDirs | 列出所有目录,函数setFilter()设置的过滤器必须包含这个选项。 |
QDir::Files | 列出所有文件。 |
QDir::Drives | 列出驱动器。 |
QDir::NoDotAndDotDot | 不列出目录下的" . "和“ .. ”特殊项。 |
QDir::Hidden | 列出隐藏文件。 |
QDir::System | 列出系统文件 |
(2),文件名过滤器。如果函数setFilter()设置的过滤器允许列出文件,就可以用函数setNameFilter()设置文件名过滤器,使模型只显示特定类型的文件,例如只显示文件名后缀为.jpg的文件。
void setNameFilter(const QStringList &filters) //设置文件名过滤器
参数filters是允许的文件名字符串列表,一般用通配符表示。
函数setNameFilterDisables()可以设置未通过文件名过滤器过滤项的显示方式,定义如下:
void setNameFilterDisables(bool enable)
如果参数enable设置为true,未通过文件名过滤器过滤的项只是被设置为禁用,如果参数enables为false,未通过文件名过滤器过滤的项就被隐藏。
(3),模型选择。函数setOption()可以设置模型的一些选项,函数定义如下:
void setOption(QFIleSystemModel::Option option,bool on=true)
参数option是枚举类型QFIleSystemModel::Option,各枚举值的含义如下。
QFileSystemModel::DontWatchForChanges:不监视文件系统的变化,默认是监视。
QFileSystemModel::DontResolveSymlinks: 不解析文件系统的符号连接项,默认是解析。
QFileSystemModel::DontUseCustomDirectoryIcons:不使用自定义的目录图标,默认是使用系统的图标。
3,获取目录和文件的信息
QFIleSystemModel可以返回模型中某个项的一些信息,有如下几个函数:
QIcon fileIcon(const QModelIndex &index)//返回项的图标
QFileInfo fileInfo(const QModelIndex &index)//返回项的文件信息
QString fileName(const QModelIndex &index)//返回不含路径的文件名或最后一级文件夹名称
QString filePath(const QModelIndex &index)//返回项的路径或包含路径的文件名
QDataTime lastModified(const QModelIndex &index)//返回项的最后修改日期
bool isDir(const QModelIndex &index)//判断项是不是一个文件夹
qint64 size(const QModelIndex &index)//返回文件的大小 (字节数),若是文件夹返回值为0
QString type(const QModelIndex &index)//返回项的类型描述文字
这些函数都需要一个模型索引index作为输入参数,表示模型的一项。在TreeView中点击一个节点时可以获得当前节点的模型索引
4,操作目录和文件
通过QFIleSystemModel的接口函数,可以在文件系统中创建或删除文件夹,还可以删除文件。
QModelIndex mkdir(const QModelIndex &parent,const QString &name) //创建文件夹
bool rmdir(const QModelIndex &parent) //删除文件夹
bool remove(const QModelIndex &parent)//删除文件
用函数mkdir()创建一个文件夹时需要指定一个父节点,函数rmdir()用于删除模型索引index表示的文件夹,函数remove()用于删除模型索引index表示的文件
注意!rmdir()和remove()会从实际的文件系统中删除文件夹和文件,如果不想修改文件系统,可以用函数QFIleSystemModel::setReadOnly()将模型设置为只读的。
QTreeView类
QTreeView是用于显示树状模型的视图组件,其与QFIleSystemModel模型结合就可以显示本机的文件系统。QTreeView新定义了两个信号,在一个节点处展开子节点是会触发expanded()信号,折叠子节点时会触发collapsed()信号。在QTreeView组件上点击时,chicked()信号会传递当前节点的模型索引,通过正模型索引就可以用QFIleSystemModel类的接口函数对这个节点表示的文件夹或文件进行各种操作。
QTreeView组件的clicked()信号只能传递当前节点的模型索引,如果QTreeView组件允许多选操作,就需要使用QItemSelectionModel选择模型,通过选择模型获取所有被选中的节点的模型索引。
代码实现