QT使用QFileSystemModel实现的文件资源管理器(开源)

文章目录

      • 效果图
      • 现实的功能
      • 总体框架
      • 功能介绍
        • 视图
        • 双击进入处理
        • 复制与剪切
        • 粘贴
        • 重命名,新建
        • 显示文件详细信息
        • 文件路径导航栏
      • 总结

效果图

在这里插入图片描述

现实的功能

  1. 支持文件/文件夹复制,粘贴,剪切,删除,重命名的基本操作
  2. 支持打开图片,文档等资源
  3. 支持文件显示详细信息
  4. 支持文件路径导航

总体框架

  • 本案例主要使用了QFileSystemModelQListView。上方的路径导航栏使用了QListWidget,每一个路径名为一个item。关键在于你对QFileSystemModel 的使用。

功能介绍

视图
  • 创建QFileSystemModel 模型与QListView视图,并设置相关参数,就可以显示本地的文件目录。关键在于要设置setViewMode函数。
// 创建文件系统模型
model = new QFileSystemModel(this);
model->setRootPath(QDir::homePath());

// 创建ListView并设置其模型
listView = new FileListView(this);
listView->setModel(model);
listView->setRootIndex(model->index(QDir::homePath()));
// 禁止拖拽
listView->setDragEnabled(false);
listView->setMovement(QListView::Static);
// 设置文件系统视图为大图标模式
listView->setViewMode(QListView::IconMode);
listView->setResizeMode(QListView::Adjust);
listView->setSpacing(20);
listView->setIconSize(QSize(48, 48));
listView->setGridSize(QSize(80, 80));
listView->installEventFilter(this);
双击进入处理
  • 在进入下一级的时候,要判断是文件还是文件夹,文件夹则进入,文件则调用系统默认的软件打开。
void FileExplorer::onDoubleClicked(const QModelIndex &index)
{
    if (model->isDir(index))
    {
        listView->setRootIndex(index);
        updatePath(index);
    }
    else
    {
        QString filePath = model->filePath(index);
        // 处理文件的打开逻辑
        QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));
    }
}
复制与剪切
  • 复制与剪切的逻辑相似,需要维护一个保存要操作文件的路径,和判断是否为剪切的标志位。剪切就是使用复制,粘贴成功后删除原有的文件。
void FileExplorer::copyFileOrFolder()
{
    cutOperation = false;
    QModelIndexList indexes = listView->selectionModel()->selectedIndexes();
    listOfFilesToCopy.clear();
    for (QModelIndex index : indexes)
    {
        QString filePath = model->filePath(index);
        listOfFilesToCopy.append(filePath);
    }
    listView->clearSelection();
}

粘贴
  • 我们从复制/剪切下得到了需操作文件的路径,就可以使用copy函数实现粘贴,需要注意的是,要复制目录内容,需要递归地复制所有文件和子目录,若路径不存在则创建不存在的文件,不然无法复制粘贴成功,若是剪切,粘贴完后要删除原文件,并清空链表。
//代码过长略
重命名,新建
  • 这都简单略过
显示文件详细信息
  • 这个需要利用到事件过滤器,当判断到事件为 QEvent::ToolTip时,使用QToolTip显示得到的文件信息。
bool FileExplorer::eventFilter(QObject *watched, QEvent *event)
{
    // 验证事件是针对 listView 的
    if (watched == listView && event->type() == QEvent::ToolTip)
    {
        QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
        if (helpEvent)
        {
            QModelIndex index = listView->indexAt(helpEvent->pos());
            if (index.isValid())
            {
                QString toolTipText;
                QLocale locale;
                // 获取项的完整路径
                QString filePath = model->filePath(index);
                QFileInfo fileInfo(filePath);
                QString longDate = locale.toString(fileInfo.lastModified(), QLocale::LongFormat);
                toolTipText = QString("Name: %1\nSize: %2KB\nType: %3\nLast Modified: %4")
                                  .arg(fileInfo.fileName())
                                  .arg(!fileInfo.isFile() ? calculateFolderSize(filePath) : fileInfo.size() / 1024)
                                  .arg(!fileInfo.isFile() ? "file" : fileInfo.suffix())
                                  .arg(longDate);

                // 显示工具提示
                QToolTip::showText(helpEvent->globalPos(), toolTipText);
            }
            else
            {
                QToolTip::hideText();
                event->ignore();
            }
            return true; // 事件已处理
        }
    }
    // 如果不是自己处理的事件,调用基类的事件过滤器
    return QWidget::eventFilter(watched, event);
}
文件路径导航栏
  • 主要思想就是使用QListWidget,每当路径变化时,就使用文件名重新生成item,点击其中一个文件名时,就会拼接成正确的路径名从而实现跳转。
void FileListWidget::refresh(const QString &dir)
{
    this->clear();
    auto initlist = dir.split("/");
    for (auto &str : initlist)
    {
        QListWidgetItem *item = new QListWidgetItem(str, this);
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
        addItem(">");
        addItem(item);
    }
}

void FileExplorer::onitemClicked(QListWidgetItem *item)
{
    if (!item)
        return;
    auto row = fileList->row(item) + 1;
    QString strdir;
    for (int i = 0; i < row; ++i)
    {
        QListWidgetItem *itemc = fileList->item(i);
        if (itemc->text() != ">")
        {
            strdir.push_back(QString(itemc->text() + "/"));
        }
    }
    strdir.chop(1);
    if (!strdir.isEmpty())
    {
        fileList->refresh(strdir);
        model->setRootPath(strdir);
        listView->setRootIndex(model->index(strdir));
    }
}

总结

  • 文件操作的功能基本实现,但还是存在一些BUG需要处理,有些功能可加入,待完善。
  • 知识理应共享,源码在此(持续优化)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/356237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一键部署私有化的思维导图SimpleMindMap

简介 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性&#xff0c;包含插件化架构、多种结构类型&#xff08;逻辑结构图、思维导图、组织结构图等&#xff09;、节点内容支持文本、图片、图标、超链接等&#xff0c;支持拖拽、导入导出功能、快捷…

windows消息循环之手撸一个Win32窗口程序

Windows消息循环&#xff08;Windows Message Loop&#xff09; 在Windows操作系统中&#xff0c;一个程序通过不断地接收和处理消息来保持活动状态的一种机制。在Windows编程中&#xff0c;消息循环是处理用户输入、操作系统事件和其他消息的关键部分。 在Windows应用程序中…

join | join_any | join_none之间的区别

文章目录 前言一、join/join_any/join_none之间的区别总结 前言 本文主要记录一下&#xff0c;与fork想匹配的三个选项&#xff0c;join/join_any/join_none之间的区别。 一、join/join_any/join_none之间的区别 join&#xff0c;等到所有的子进程全部结束&#xff0c;才能继…

软件测试|Python自动化测试实现的思路

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步&#xff1a; 1. 确定自动化测试的范围和目标&#xff1a; 首先需要明确需要进行自动化测试的范围和目标&#xff0c;包括测试场景、测试用例、测试数据等。 2. 选择自动化…

【代码随想录-链表】移除链表元素

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

shell脚本——条件语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试&#xff08;短路运算&#xff09; 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试&#xff1a;判断某需求是…

《Linux C编程实战》笔记:管道

从这节开始涉及进程间的通信&#xff0c;本节是管道。 管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性&#xff0c;管道又称之为半双工管道。。管道的这一特点决定了其使用的局限性。 数据只能由一个进程刘翔另一个进程&#xff1b;如果要进行全双工通信…

快速掌握PHP:用这个网站,让学习变得简单有趣!

介绍&#xff1a;PHP是一种广泛使用的开源服务器端脚本语言&#xff0c;特别适合Web开发。 PHP&#xff0c;全称为Hypertext Preprocessor&#xff0c;即超文本预处理器&#xff0c;是一种嵌入在HTML中的服务器端脚本语言。它主要用于管理动态内容和数据库交互&#xff0c;使得…

双非本科准备秋招(9.3)—— JVM2

学这个JVM还是挺抽象的&#xff0c;不理解的东西我尽量记忆了&#xff0c;毕竟刚接触两天&#xff0c;也没遇到过实际应用场景&#xff0c;所以学起来还是挺费劲的&#xff0c;明天再补完垃圾回收这块的知识点。U•ェ•*U 先补一下JVM运行时的栈帧结构。 线程调用一个方法的执…

【并发编程】volatile原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程⛺️稳重求进&#xff0c;晒太阳 volatile原理实现是内存屏障&#xff0c;Memory Barrier 对volatile变量的写指令后会加入写屏障。对volatile变量的读指令前会加入读屏障 如何保…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程&#xff08;源码解读&#xff09; BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor&#xff1a; From java doc&#xff1a; BeanFactoryPostProcessor may interact with and modify bean defin…

网工内推 | 申通快递急招网安、测试工程师,包食宿,30k*13薪

01 申通快递 招聘岗位&#xff1a;信息安全工程师 职责描述&#xff1a; 1、 负责集团数据安全风险的识别、协同、跟踪、改进优化及事后评估&#xff1b; 2、 负责集团数据安全专项风险的治理及系统上线前的数据安全评审&#xff1b; 3、 负责集团信息安全、合规等方面制度的编…

限时回归!!!3D版《空洞骑士》!!!

空洞骑士是一款基于横板平台跳跃的传统风格2D动作冒险游戏。庞大的游戏世界交错相通&#xff0c;玩家控制小虫子去探索幽深黑暗的洞穴&#xff0c;成为了一代人茶余饭后的惦念&#xff0c;深受广大玩家们的喜爱。 这类平台跳跃游戏一般是游戏开发初学者以及独立游戏开发者们比…

React一学就会(7): 细说redux及其应用

不知不觉一个星期结束了&#xff0c;很快就要过年了&#xff0c;中间休息了两天&#xff0c;小孩生病&#xff0c;我也有点感冒了&#xff0c;还好&#xff0c;我的这个 React 基础教学课程也基本结束了。大家有不明白的可以留言问我&#xff0c;我一定竭尽所能的帮助你。后面几…

D3703F——应用于音响系统的静音检测电路 当音响系统在放音或快进 / 退时进行静音检测,输出控制信号。

D3703F 是 一 块 汽 车 音 响 静 音 检 测 电 路 。 用 于 音 响 系 统 检 测 在 放 音 或 快 进 / 退 时 进 行 静 音 检 测 。 D3703F 的 的 电 压 范 围 &#xff1a; 3.2V &#xff5e; 16V &#xff0c; 信 号 检 测 和 静 音 时 间 可 通 过 外 围 电 阻 、 电 容 来 …

中小型企业知识库建设的秘诀来啦,赶紧收藏起来

知识库是企业的智慧宝库&#xff0c;其中的信息和知识的整合&#xff0c;可以极大地提高工作效率和团队协作能力。尤其对中小企业来说&#xff0c;知识库的建设更是关系企业未来发展的重要因素。那么&#xff0c;怎样有效地构建高效的知识库系统呢&#xff1f;下面这些秘诀值得…

Arthas的使用

1. 简介 官网 线上debug神器&#xff0c;就不过多介绍 2. 环境搭建 win11环境 ,jdk11 2.1 安装 下载地址 2.2 启动 cmd java -jar arthas-boot.jar启动之后会自动检测启动的java服务 1~4 &#xff0c;springboot是启动类名&#xff0c;所以我选择了3 3. 常用操作 3.…

Hadoop3.x基础(1)

来源&#xff1a;B站尚硅谷 这里写目录标题 大数据概论大数据概念大数据特点(4V)大数据应用场景 Hadoop概述Hadoop是什么Hadoop发展历史&#xff08;了解&#xff09;Hadoop三大发行版本&#xff08;了解&#xff09;Hadoop优势&#xff08;4高&#xff09;Hadoop组成&#xf…

非阿里云注册域名如何在云解析DNS设置解析?

概述 非阿里云注册域名使用云解析DNS&#xff0c;按照如下步骤&#xff1a; 添加域名。 添加解析记录。 修改DNS服务器。 DNS服务器变更全球同步&#xff0c;等待48小时。 添加解析记录 登录云解析DNS产品控制台。 在 域名解析 页面中&#xff0c;单击 添加域名 。 在 …

SkyWalking+es部署与使用

第一步下载skywalking :http://skywalking.apache.org/downloads/ 第二步下载es:https://www.elastic.co/cn/downloads/elasticsearch 注&#xff1a;skywalking 和es要版本对应&#xff0c;可从下面连接查看版本对应关系&#xff0c;8.5.0为skywalking 版本号 Index of /di…