Qt进阶开发:QDirModel的使用

文章目录

    • 一、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。

相关推荐
梦回阑珊2 小时前
《QT从基础到进阶·七十四》Qt+C++开发一个python编译器,能够编写,运行python程序改进版
c++·python·qt
明月醉窗台3 小时前
Qt 入门 1 之第一个程序 Hello World
开发语言·c++·qt
冰红茶兑滴水6 小时前
Qt 音乐播放器项目
开发语言·qt
LoveXming8 小时前
Qt采用多线程实现ABAB交叉打印
开发语言·qt
永不停转14 小时前
从源码解析 QGraphicsItem 旋转、缩放、平移、transform等变换操作,利用QGraphicsTransform实现变形动画
c++·qt
老歌老听老掉牙16 小时前
C++使用Qt Charts创建数据可视化图表
c++·qt·信息可视化
&Sinnt&1 天前
C++/Qt 模拟sensornetwork的工作
c++·qt
꧁坚持很酷꧂1 天前
Qt实现鼠标右键弹出弹窗退出
数据库·qt·计算机外设