文章目錄
- 一、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。