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需要处理,有些功能可加入,待完善。
  • 知识理应共享,源码在此(持续优化)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法分析与设计】交换两个节点

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

2024美赛数学建模D题思路分析

美赛思路已更新&#xff0c;关注后文末名片可以获取更多思路。并且领取资料 D题思路 五大湖的水不仅是许多城市饮用水的来源&#xff0c;也支撑着渔业、娱乐、发电、航运等多种用途。如何管理这些湖泊的水位&#xff0c;既能满足各种需求&#xff0c;又能防止洪水或水位过低影…

Python程序设计 函数基础

简单函数 函数&#xff1a;就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用包含两个步骤&#xff1a; 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用&#xff0c;在开发程序时&#xff0c;使用…

【毕业日记】2024.01 - 慢下来,静待花开

转眼距离930离开鹅厂已经120天了&#xff0c;我是很能拖延的&#xff0c;或者是很懂自我麻痹的&#xff0c;这三个多月&#xff0c;一直想要写点东西纪念&#xff0c;一直拖一直拖一直拖…… 疫情这几年经济下行里裁员是个茶余饭后“嬉笑”之余经常被提起的词&#xff0c;部门滚…

【Qt基本功修炼】Qt线程的两种运行模式

1. 前言 QThread是Qt中的线程类&#xff0c;用于实现多线程运行。 QThread有两种工作模式&#xff0c;即 消息循环模式无消息循环模式 两种模式分别适用于不同的场景。下面我们将从多个方面&#xff0c;讲解QThread两种工作模式的区别。 2. 消息循环模式 2.1 实现原理 Q…

virtualBox虚拟机安装ubuntu后的必要配置

1. 使能双向copy 粘贴功能。在device menu的 shared clipboard项, 选bidirectional. 2.启用共享文件夹。 在device 菜单的 shared folder 项配置&#xff0c; (对于日期乱码问题和命令行打不开的问题请见ubuntu18.04安装后时间日期乱码及terminal打不开解决方法_电脑日期变成…

ip地址是不是人在哪地址就在哪

在数字化世界中&#xff0c;IP地址作为一个关键的标识符&#xff0c;越来越多地被用于定位个人的地理位置。然而&#xff0c;这种定位是否准确&#xff1f;IP地址是不是人在哪地址就在哪&#xff1f;下面与虎观代理小二二一起来了解下吧。 IP地址通常表示的是数据包产生的地理…

PAT-Apat甲级题1004(python和c++实现)

PTA | 1004 Counting Leaves 1004 Counting Leaves 作者 CHEN, Yue 单位 浙江大学 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child. Input Specification: Each input file contains one te…

排序(5)——归并排序

六、归并排序 1.简介 归并排序也是一种很经典的排序算法&#xff0c;采用分治的思想方法进行数据的处理。归并讲究的是先拆后合&#xff0c;也就是分治中的分而治之。在拿到一组数据后&#xff0c;程序会将整个数据进行不断拆分直至有序&#xff0c;因为单个元素必然有序&…

2024美赛数学建模C题思路+模型+代码+论文

2024美赛A-F题思路代码模型论文&#xff1a;2.2开赛第一时间更新&#xff0c;获取见文末名片 美赛流程以及经验分享 今天主要和大家分享一下我之前参加美赛的经验&#xff0c;主要分两部分来讲。一部分是美赛流程&#xff0c;另一部分是美赛经验。 一 美赛流程 比赛前&#x…

教你怎么给接口定义错误码

错误码一般包括三个要素&#xff1a; 前缀标识&#xff1a;区分错误类型&#xff0c;比如请求不合法&#xff0c;还是服务器处理错误。模块标识&#xff1a;区分到底是哪个模块的错误。错误代码&#xff1a;区分具体是什么问题。 从错误码的符号组成上看又分为三类&#xff1…

网络发展历程及SD-WAN的优势

自网络出现以来&#xff0c;经历了不同时期的发展阶段&#xff0c;而SD-WAN作为网络发展的新趋势&#xff0c;以其独特的优势满足了当今企业对于高效、灵活和成本控制的网络需求。 一、网络发展历程 &#xff08;1&#xff09;初始阶段&#xff1a;专线网络 从1980年代到2000…

VBA数据库解决方案第八讲:SQL语句及打开记录集

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

20240202金融读报1分钟小得

1、今年份KPI&#xff1f;沿江沿河省级分行要继续坚持开展“长江行”“黄河行”活动&#xff0c;深入研究不同区域、不同河段的特点和需求&#xff0c;研究制定差异化、多元化金融服务方案。 2、作为长线投资者&#xff0c;联博对中国股市非常乐观。当前A股市场是全球最具吸引力…

Ubuntu 编译安装 nginx

Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1 安装依赖 sudo apt install libgd-dev 下载nginx wget http://nginx.org/download/nginx-1.22.1.tar.gz 解压nginx tar -zvxf nginx-1.22.1.tar.gz 编译安装 cd nginx-1.22.1 编译并指定安装位置&#xff0c;执行安装之后会创建指…

flowable 设置自定义属性教程

概述 由于工作需要给flowable工作流设计器添加自定义属性&#xff0c;以满足功能实现。所以这篇文章介绍下用flowable 开源的的flowable-ui 前端添加自定义属性&#xff0c;后端解析属性值的例子。 技术栈 序号技术点名称版本1Flowable6.8.0 使用的是flowable6.8.0 版的代码…

画质和场景双需求下,海信电视U8KL的变与不变

又到一年春节&#xff0c;最近几年大家过年的方式越来越丰富&#xff0c;但是跟家人在一起看春晚依然是主流&#xff0c;电视也是过年不可或缺的家庭成员。 当然&#xff0c;随着大家对生活品质的要求更高&#xff0c;对电视的要求也变得更高了。比如&#xff0c;现在春晚直播…

Java实现对接微信支付功能接口详解(二)

本系列文章简介&#xff1a; 微信支付是一种在线支付解决方案&#xff0c;允许用户通过微信内的支付功能进行付款。它提供了多种支付方式&#xff0c;包括扫码支付、公众号支付、小程序支付等。在Java应用程序中实现微信支付功能&#xff0c;可以为用户提供方便快捷的支付体验。…

爬虫笔记(三):实战qq登录

咳咳&#xff0c;再这样下去会进橘子叭hhhhhh 以及&#xff0c;这个我觉得大概率是成功的&#xff0c;因为测试了太多次&#xff0c;登录并且验证之后&#xff0c;qq提醒我要我修改密码才可以登录捏QAQ 1. selenium 有关selenium具体是啥&#xff0c;这里就不再赘述了&#x…

leetcode c++ 超出内存限制

给两个主要原因&#xff0c;这两个原因&#xff0c;如果在递归或者循环里就很容易导致内存超出限制 首先就是误用 如果只是变量的变化实现的话&#xff0c;或者-就可以了&#xff0c;不需要写成AAx的形式&#xff0c;那样会重新开辟一块内存 其次就是值传递 值传递也是会开辟…