Qt进阶开发:QFileSystemModel的使用

一、QFileSystemModel的基本介绍

  QFileSystemModel 是 Qt 框架中用于管理和显示本地文件系统的 MVC 结构中的 Model。它可以与 QTreeView、QListView 或 QTableView 结合使用,实现文件管理功能。相比 QDirModel,QFileSystemModel 只会加载需要的目录,支持懒加载,在处理大文件夹时更高效。

主要特点:

  • 继承自 QAbstractItemModel,提供标准的文件系统数据模型。
  • 懒加载(Lazy Loading):不会一次性加载整个文件系统,只会加载需要的部分,提升性能。
  • 支持文件过滤(setFilter()、setNameFilters())。
  • 自动监听文件系统变化,实时更新 UI。

二、QFileSystemModel的基本使用

2.1 在 QTreeView 中使用

#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    QFileSystemModel model;
    model.setRootPath(QDir::homePath());  // 设置根目录

    QTreeView treeView;
    treeView.setModel(&model);
    treeView.setRootIndex(model.index(QDir::homePath())); // 绑定视图
    treeView.show();

    return app.exec();
}

在这里插入图片描述

2.2 在 QListView 中使用

QListView listView;
listView.setModel(&model);
listView.setRootIndex(model.index(QDir::homePath()));
listView.show();

在这里插入图片描述

2.3 在 QTableView 中使用

QTableView tableView;
tableView.setModel(&model);
tableView.setRootIndex(model.index(QDir::homePath()));
tableView.show();

在这里插入图片描述

三、QFileSystemModel的常用API

在这里插入图片描述

3.1 设置根目录

model.setRootPath(QDir::homePath());  // 设置为用户目录

注意:setRootPath() 只是设置数据模型的根目录,并不会影响 QTreeView 显示的目录。要限制 QTreeView 的显示范围,需使用 setRootIndex()。

3.2 过滤文件

3.2.1 仅显示文件
model.setFilter(QDir::Files | QDir::NoDotAndDotDot);

QDir::Files 只显示文件,QDir::NoDotAndDotDot 过滤掉 . 和 … 目录。

3.2.2 只显示特定后缀的文件
model.setNameFilters(QStringList() << "*.cpp" << "*.h");
model.setNameFilterDisables(false); // 过滤掉不符合的文件

这将只显示 .cpp 和 .h 文件。

3.2.3 只显示目录
model.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);

只显示目录,隐藏所有文件。

四、监听文件系统变化

1. QFileSystemModel常见信号

在这里插入图片描述

2. 信号的使用示例

2.1 监听目录加载完成

当 QFileSystemModel 完成某个目录的加载时,可以使用 directoryLoaded() 信号:

#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>
#include <QDebug>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    QFileSystemModel model;
    QObject::connect(&model, &QFileSystemModel::directoryLoaded, 
                     [](const QString &path) {
   
   
                         qDebug() << "目录加载完成:" << path;
                     })
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值