文章目录
- 一、QDirModel的基本介绍
- 二、QDirModel的基本使用
- 2.1 在 QTreeView 中显示文件系统
- 2.2 在 QListView 显示当前目录
- 2.3 在 QTableView 中使用
- 三、QDirModel的常用API
- 1. 构造 & 目录操作
- 1.1 创建 QDirModel
- 1.2 设置根目录
- 2. 过滤 & 排序
- 2.1 过滤文件类型
- 2.2 设置排序
- 3. 获取文件信息
- 3.1 获取文件名
- 3.2 获取文件完整路径
- 3.3 判断是否是目录
- 3.4 获取文件大小
- 3.5 获取文件修改时间
- 3.6 获取文件类型
- 4. 索引操作
- 4.1 通过路径获取 QModelIndex
- 4.2 通过 QModelIndex 获取父目录
- 4.3 获取子目录
- 5. 监听文件选择
- 四、监听文件系统变化
一、QDirModel的基本介绍
QDirModel是 Qt 早期用于显示文件系统(目录、文件)的 QAbstractItemModel 之一,它用于配合 QTreeView 以层级结构显示文件夹和文件。需要注意的是QDirModel 在 Qt 4.6 之后被 QFileSystemModel 取代,不推荐在新项目中使用 QDirModel,应使用 QFileSystemModel 代替。
它们的主要区别:
- QDirModel 会加载所有子目录和文件,导致大量目录时性能较差。
- QFileSystemModel 是懒加载的,不会预加载所有子目录,性能更好。
二、QDirModel的基本使用
2.1 在 QTreeView 中显示文件系统
#include <QApplication>
#include <QTreeView>
#include <QDirModel>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建 QDirModelQDirModel model;model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); // 显示所有文件和文件夹// 创建 QTreeViewQTreeView 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 显示当前目录
#include <QApplication>
#include <QListView>
#include <QDirModel>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建 QDirModelQDirModel model;model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);// 创建 QListViewQListView listView;listView.setModel(&model);// 设置要显示的目录listView.setRootIndex(model.index(QDir::homePath()));listView.show();return app.exec();
}
2.3 在 QTableView 中使用
#include <QApplication>
#include <QTableView>
#include <QDirModel>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建 QDirModelQDirModel model;model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);// 创建 QTableViewQTableView 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
QDirModel *model = new QDirModel(parent);
作用:创建 QDirModel,用于显示文件系统。
1.2 设置根目录
model->setRootPath(QDir::homePath()); // 设置为用户主目录
作用:设置 QDirModel 的根目录,但不会影响 QTreeView 的 setRootIndex()。
2. 过滤 & 排序
2.1 过滤文件类型
model->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
作用:控制 QDirModel 显示的文件/目录类型。
可选值:
- QDir::Files ➝ 仅显示文件
- QDir::Dirs ➝ 仅显示目录
- QDir::AllEntries ➝ 显示所有(默认)
- QDir::Hidden ➝ 显示隐藏文件
- QDir::NoDotAndDotDot ➝ 隐藏 . 和 …
2.2 设置排序
model->setSorting(QDir::Name | QDir::IgnoreCase);
作用:控制文件/目录排序方式。
可选值:
- QDir::Name ➝ 按名称排序
- QDir::Size ➝ 按大小排序
- QDir::Type ➝ 按类型排序
- QDir::Time ➝ 按修改时间排序
3. 获取文件信息
3.1 获取文件名
QString fileName = model->fileName(index);
作用:返回 index 对应的文件名(不包含路径);如file.txt。
3.2 获取文件完整路径
QString filePath = model->filePath(index);
作用:返回 index 对应的完整路径;如/home/user/Documents/file.txt。
3.3 判断是否是目录
bool isDirectory = model->isDir(index);
作用:判断 index 是否是目录。
返回值:true ➝ 目录;false ➝ 文件。
3.4 获取文件大小
qint64 size = model->size(index);
作用:获取 index 对应的文件大小(字节)。例如返回 1024(表示 1 KB)。
3.5 获取文件修改时间
QDateTime modifiedTime = model->lastModified(index);
作用:返回 index 对应文件的最后修改时间。例如2024-04-01 12:30:45。
3.6 获取文件类型
QString fileType = model->type(index);
作用:返回文件类型描述(如 文本文件、文件夹)。例如Text File、Folder。
4. 索引操作
4.1 通过路径获取 QModelIndex
QModelIndex index = model->index("/home/user/Documents/file.txt");
作用:获取指定路径的 QModelIndex,用于 QTreeView、QListView 等。
4.2 通过 QModelIndex 获取父目录
QModelIndex parentIndex = model->parent(index);
作用:获取 index 的父目录索引。
4.3 获取子目录
QModelIndex childIndex = model->index(0, 0, index);
作用:获取 index 目录下的第一个文件/子目录。
5. 监听文件选择
QObject::connect(treeView, &QTreeView::clicked, [&](const QModelIndex &index) {QString filePath = model->filePath(index);qDebug() << "用户选择了:" << filePath;
});
四、监听文件系统变化
当某个目录被成功加载后触发。
connect(model, &QDirModel::directoryLoaded, [](const QString &path){qDebug() << "Directory loaded:" << path;
});
当某个文件或目录被重命名时触发。
connect(model, &QDirModel::fileRenamed, [](const QString &path, const QString &oldName, const QString &newName){qDebug() << "File renamed in" << path << "from" << oldName << "to" << newName;
});
当 setRootPath() 被调用,并且根目录发生改变时触发。
connect(model, &QDirModel::rootPathChanged, [](const QString &newPath){qDebug() << "Root path changed to:" << newPath;
});
当新的文件或目录被添加时触发。
connect(model, &QDirModel::rowsInserted, [](const QModelIndex &parent, int start, int end){qDebug() << "Rows inserted from" << start << "to" << end << "under parent" << parent;
});
当文件或目录被删除时触发。
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。