文章目录
-
- 一、QDirModel的基本介绍
- 二、QDirModel的基本使用
-
- [2.1 在 QTreeView 中显示文件系统](#2.1 在 QTreeView 中显示文件系统)
- [2.2 在 QListView 显示当前目录](#2.2 在 QListView 显示当前目录)
- [2.3 在 QTableView 中使用](#2.3 在 QTableView 中使用)
- 三、QDirModel的常用API
-
- [1. 构造 & 目录操作](#1. 构造 & 目录操作)
-
- [1.1 创建 QDirModel](#1.1 创建 QDirModel)
- [1.2 设置根目录](#1.2 设置根目录)
- [2. 过滤 & 排序](#2. 过滤 & 排序)
-
- [2.1 过滤文件类型](#2.1 过滤文件类型)
- [2.2 设置排序](#2.2 设置排序)
- [3. 获取文件信息](#3. 获取文件信息)
-
- [3.1 获取文件名](#3.1 获取文件名)
- [3.2 获取文件完整路径](#3.2 获取文件完整路径)
- [3.3 判断是否是目录](#3.3 判断是否是目录)
- [3.4 获取文件大小](#3.4 获取文件大小)
- [3.5 获取文件修改时间](#3.5 获取文件修改时间)
- [3.6 获取文件类型](#3.6 获取文件类型)
- [4. 索引操作](#4. 索引操作)
-
- [4.1 通过路径获取 QModelIndex](#4.1 通过路径获取 QModelIndex)
- [4.2 通过 QModelIndex 获取父目录](#4.2 通过 QModelIndex 获取父目录)
- [4.3 获取子目录](#4.3 获取子目录)
- [5. 监听文件选择](#5. 监听文件选择)
- 四、监听文件系统变化
一、QDirModel的基本介绍
QDirModel是 Qt 早期用于显示文件系统(目录、文件)的 QAbstractItemModel 之一,它用于配合 QTreeView 以层级结构显示文件夹和文件。需要注意的是QDirModel 在 Qt 4.6 之后被 QFileSystemModel 取代,不推荐在新项目中使用 QDirModel,应使用 QFileSystemModel 代替。
它们的主要区别:
- QDirModel 会加载所有子目录和文件,导致大量目录时性能较差。
- QFileSystemModel 是懒加载的,不会预加载所有子目录,性能更好。
二、QDirModel的基本使用
2.1 在 QTreeView 中显示文件系统
cpp
#include <QApplication>
#include <QTreeView>
#include <QDirModel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建 QDirModel
QDirModel model;
model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); // 显示所有文件和文件夹
// 创建 QTreeView
QTreeView treeView;
treeView.setModel(&model);
// 设置根目录(桌面路径)
QModelIndex rootIndex = model.index(QDir::homePath());
treeView.setRootIndex(rootIndex);
// 显示窗口
treeView.resize(800, 600);
treeView.show();
return app.exec();
}

2.2 在 QListView 显示当前目录
cpp
#include <QApplication>
#include <QListView>
#include <QDirModel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建 QDirModel
QDirModel model;
model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
// 创建 QListView
QListView listView;
listView.setModel(&model);
// 设置要显示的目录
listView.setRootIndex(model.index(QDir::homePath()));
listView.show();
return app.exec();
}

2.3 在 QTableView 中使用
cpp
#include <QApplication>
#include <QTableView>
#include <QDirModel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建 QDirModel
QDirModel model;
model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
// 创建 QTableView
QTableView tableView;
tableView.setModel(&model);
// 设置要显示的目录
tableView.setRootIndex(model.index(QDir::homePath()));
tableView.resize(800, 600);
tableView.show();
return app.exec();
}

三、QDirModel的常用API
1. 构造 & 目录操作
1.1 创建 QDirModel
cpp
QDirModel *model = new QDirModel(parent);
作用:创建 QDirModel,用于显示文件系统。
1.2 设置根目录
cpp
model->setRootPath(QDir::homePath()); // 设置为用户主目录
作用:设置 QDirModel 的根目录,但不会影响 QTreeView 的 setRootIndex()。
2. 过滤 & 排序
2.1 过滤文件类型
cpp
model->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
作用:控制 QDirModel 显示的文件/目录类型。
可选值:
- QDir::Files ➝ 仅显示文件
- QDir::Dirs ➝ 仅显示目录
- QDir::AllEntries ➝ 显示所有(默认)
- QDir::Hidden ➝ 显示隐藏文件
- QDir::NoDotAndDotDot ➝ 隐藏 . 和 ...
2.2 设置排序
cpp
model->setSorting(QDir::Name | QDir::IgnoreCase);
作用:控制文件/目录排序方式。
可选值:
- QDir::Name ➝ 按名称排序
- QDir::Size ➝ 按大小排序
- QDir::Type ➝ 按类型排序
- QDir::Time ➝ 按修改时间排序
3. 获取文件信息
3.1 获取文件名
cpp
QString fileName = model->fileName(index);
作用:返回 index 对应的文件名(不包含路径);如file.txt。
3.2 获取文件完整路径
cpp
QString filePath = model->filePath(index);
作用:返回 index 对应的完整路径;如/home/user/Documents/file.txt。
3.3 判断是否是目录
cpp
bool isDirectory = model->isDir(index);
作用:判断 index 是否是目录。
返回值:true ➝ 目录;false ➝ 文件。
3.4 获取文件大小
cpp
qint64 size = model->size(index);
作用:获取 index 对应的文件大小(字节)。例如返回 1024(表示 1 KB)。
3.5 获取文件修改时间
cpp
QDateTime modifiedTime = model->lastModified(index);
作用:返回 index 对应文件的最后修改时间。例如2024-04-01 12:30:45。
3.6 获取文件类型
cpp
QString fileType = model->type(index);
作用:返回文件类型描述(如 文本文件、文件夹)。例如Text File、Folder。
4. 索引操作
4.1 通过路径获取 QModelIndex
cpp
QModelIndex index = model->index("/home/user/Documents/file.txt");
作用:获取指定路径的 QModelIndex,用于 QTreeView、QListView 等。
4.2 通过 QModelIndex 获取父目录
cpp
QModelIndex parentIndex = model->parent(index);
作用:获取 index 的父目录索引。
4.3 获取子目录
cpp
QModelIndex childIndex = model->index(0, 0, index);
作用:获取 index 目录下的第一个文件/子目录。
5. 监听文件选择
cpp
QObject::connect(treeView, &QTreeView::clicked, [&](const QModelIndex &index) {
QString filePath = model->filePath(index);
qDebug() << "用户选择了:" << filePath;
});
四、监听文件系统变化
当某个目录被成功加载后触发。
cpp
connect(model, &QDirModel::directoryLoaded, [](const QString &path){
qDebug() << "Directory loaded:" << path;
});
当某个文件或目录被重命名时触发。
cpp
connect(model, &QDirModel::fileRenamed, [](const QString &path, const QString &oldName, const QString &newName){
qDebug() << "File renamed in" << path << "from" << oldName << "to" << newName;
});
当 setRootPath() 被调用,并且根目录发生改变时触发。
cpp
connect(model, &QDirModel::rootPathChanged, [](const QString &newPath){
qDebug() << "Root path changed to:" << newPath;
});
当新的文件或目录被添加时触发。
cpp
connect(model, &QDirModel::rowsInserted, [](const QModelIndex &parent, int start, int end){
qDebug() << "Rows inserted from" << start << "to" << end << "under parent" << parent;
});
当文件或目录被删除时触发。
cpp
connect(model, &QDirModel::rowsRemoved, [](const QModelIndex &parent, int start, int end){
qDebug() << "Rows removed from" << start << "to" << end << "under parent" << parent;
});
注意:由于 QDirModel 在 Qt 5 中已被 QFileSystemModel 取代,建议使用 QFileSystemModel。