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.hqwc.cn/news/440059.html

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

相关文章

git远程仓库基本操作

目录 gitremote &#xff08;查看远程仓库&#xff09; git remote add [仓库名] [url] git clone [url]&#xff08;克隆远程仓库到本地&#xff09; git push [名][分支名]&#xff08;提交到远程仓库&#xff09;​编辑 git pull [名][分支名]从远程仓库拉取​编辑 注意操作…

图形绘制-仪表盘(3)

本章节我们介绍如何绘制仪表盘内的车速、单位&#xff08;Km/h&#xff09;、标题等信息。 效果如下&#xff1a; 关于通过继承重写QWidget的绘制事件paintEvent()&#xff0c;来绘制仪表盘的基础操作&#xff0c;请看 《图形绘制-仪表盘&#xff08;1&#xff09;-CSDN博客》…

鸿蒙南向开发——GN快速入门指南

运行GN(Generate Ninja) 运行gn&#xff0c;你只需从命令行运行gn&#xff0c;对于大型项目&#xff0c;GN是与源码一起的。 对于Chromium和基于Chromium的项目&#xff0c;有一个在depot_tools中的脚本&#xff0c;它需要加入到你的PATH环境变量中。该脚本将在包含当前目录的…

2024年【陕西省安全员B证】最新解析及陕西省安全员B证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员B证最新解析参考答案及陕西省安全员B证考试试题解析是安全生产模拟考试一点通题库老师及陕西省安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助陕西省安全员B证证考试学员顺利通过考试。 1、【…

深度学习与神经网络pytorch版 2.3 线性代数

深度学习与神经网络pytorch版 2.3 线性代数 1. 简介 深度学习与线性代数之间有着密切的联系。线性代数是深度学习算法中用于表达和处理数据的数学工具之一&#xff0c;尤其是在构建神经网络和处理多维数据时。 线性代数中的基本概念包括向量、矩阵和线性变换等&#xff0c;这…

Vulnhub靶机:niveK

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;niveK&#xff08;10.0.2.41&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/hms/nive…

ETL怎么实现文件处理

在现代企业及各类组织的日常运作中&#xff0c;数据作为一种关键的信息资源&#xff0c;其管理和分析能力直接影响到决策效率与准确性。文件作为数据的主要载体&#xff0c;承载着从运营报告、客户记录、交易明细等各种类型的数据信息。这些海量且多样的文件数据在未经处理的情…

c# textbox 提示文字

1. 定义提示文字内容 private readonly string RemarkText "最多输入100字"; // 提示文字 2. 添加textbox 焦点事件&#xff0c; 初始化textbox提示文字和字体颜色 public UserControl(){InitializeComponent();tb_Remark.Text RemarkText;tb_Remark.ForeColor…

Unity打包Android,jar文件无法解析的问题

Unity打包Android&#xff0c;jar无法解析的问题 介绍解决方案总结 介绍 最近在接入语音的SDK时&#xff0c;发现的这个问题. 当我默认导入这个插件的时候&#xff0c;插件内部的文件夹&#xff08;我下面话红框的文件夹&#xff09;名字原本为GCloudVoice&#xff0c;这时候我…

5种ai智能自动写作,让你的写作效率秒拔高

写作是一项需要耗费大量时间和精力的任务&#xff0c;但现在有了AI智能自动写作软件&#xff0c;我们可以轻松提高写作效率。在国内市场上&#xff0c;有许多优秀的写作软件可供选择。本文将向您推荐5款国内的写作软件&#xff0c;并详细说明每款软件的功能特点。 爱制作AI 使…

Linux true/false区分

bash的数值代表和其它代表相反&#xff1a;0表示true&#xff1b;非0代表false。 #!/bin/sh PIDFILE"pid"# truenginx进程运行 falsenginx进程未运行 checkRunning(){# -f true表示普通文件if [ -f "$PIDFILE" ]; then# -z 字符串长度为0trueif [ -z &qu…

Threejs 展示——点击模型指定部分添加高亮显示

文章目录 需求分析需求 如下图所示,点击模型指定部分添加高亮显示 分析 绘制一个 canvas将该 canvas 将渲染器挂载到dom<template><canvas id="three" /> </template><scr