QFileSystemModel类的基本功能
QFileSystemModel提供了一个可用于访问本机文件系统的数据模型。QFileSystemModel和视图组件QTreeView结合使用,可以用目录树的形式显示本机上的文件系统,如同Windows的资源管理器一样。使用QFileSystemModel提供的接口函数,可以创建目录、删除目录、重命名目录,可以获得文件名称、目录名称、文件大小等参数,还可以获得文件的详细信息。
要通过QFileSystemModel获得本机的文件系统,需要用setRootPath()函数为QFileSystemModel 设置一个根目录,例如:
QFileSystemModel *model = new QFileSystemModel;
model->setRootPath (QDir::currentPath());
静态函数QDir::currentPath()获取应用程序的当前路径。
用于获取磁盘文件目录的数据模型类还有一个QDirModel,QDirModel的功能与QFileSystemModel 类似,也可以获取目录和文件,但是QFileSystemModel采用单独的线程获取目录文件结构,而QDirModel 不使用单独的线程。使用单独的线程不会阻碍主线程,所以推荐使用QFileSystemModel。
QFileSystemModel的一些函数获得节点的一些参数,包括以下几种:
- bool isDir(QModelIndex &index): 判断节点是不是一个目录。
- QString filePath(QModelIndex &index): 返回节点的目录名或带路径的文件名。
- QString fileName(QModelIndex &index): 返回去除路径的文件夹名称或文件名。
- QString type(QModelIndex &index): 返回描述节点类型的文字,如硬盘符是“Drive”,文 件夹是“FileFolder”,文件则用具体的后缀描述,如“txtFile”“exeFile”“pdfFile”等。
- qint64 size(QModelIndex &index): 如果节点是文件,返回文件大小的字节数;如果节点是文件夹,返回0。
QFileSystemModel 的示例
使用QFileSystemModel作为数据模型,QTreeView、QListView和QTableView为主要组件设计的实例运行界面如下图所示。在QTreeView中以目录树的形式显示本机的文件系统, 单击一个目录时,右边的ListView和TableView显示该目录下的目录和文件。在TreeView上单击一个目录或文件节点时,下方的几个标签里显示当前节点的信息。
实例的运行时界面
在主窗口类中定义了一个QFileSystemModel类的成员变量model。
QFileSystemModel *model;
主窗口构造函数进行初始化,代码如下:
Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
model=new QFileSystemModel(this);
model->setRootPath(QDir::currentPath());
ui->treeView->setModel(model);
ui->listView->setModel(model);
ui->tableView->setModel(model);
connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
ui->listView,SLOT(setRootIndex(QModelIndex)));
connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
ui->tableView,SLOT(setRootIndex(QModelIndex)));
}
3个视图组件都使用setModel()函数,将QFileSystemModel数据模型model设置为自己的数 据模型。
connect()函数设置信号与槽的关联,实现的功能是:在单击treeView的一个节点时,此节点 就设置为listView和tableView的根节点,因为treeView的clicked(QModelIndex)信号会传递一个QModelIndex变量,是当前节点的模型索引,将此模型索引传递给listView和tableView的槽函数setRootIndex(QModelIndex),listView和tableView 就会显示此节点下的目录和文件)。
在treeView上单击一个节点时,下方的一些标签里会显示节点的一些信息,这是为treeView的clicked(const QModelIndex &index)信号编写槽函数实现的,其代码如下:
void Widget::on_treeView_clicked(const QModelIndex &index)
{
ui->chkIsDir->setChecked(model->isDir(index));
ui->labPath->setText(model->filePath(index));
ui->labType->setText(model->type(index));
ui->labFileName->setText(model->fileName(index));
int sz=model->size(index)/1024;
if(sz<1024)
ui->labFileSize->setText(QString("%1 KB").arg(sz));
else
ui->labFileSize->setText(QString("%1.f MB").arg(sz/1024.0));
}
函数有一个传递参数QModelIndex &index,它是单击节点在数据模型中的索引。通过传递来的索引index,这段代码使用了获取节点信息的几个函数。
而QFileSystemModel是如何获取磁盘目录文件结构的,3个视图组件是如何显示这些数据的,则是其底层实现的问题了。