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

news/2024/7/10 20:55:08 标签: qt, 开源, 开发语言

文章目录

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

效果图

在这里插入图片描述

现实的功能

  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.niftyadmin.cn/n/5354407.html

相关文章

centos下静态链接:/usr/bin/ld: cannot find -l某某某

问题&#xff1a;/usr/bin/ld: cannot find -l某某某 前言解法相关文章 前言 我是在静态链接的时候碰到了/usr/bin/ld: cannot find -lstdc的问题&#xff0c;这里来记录一下我是如何解决的。 如果你是动态链接的时候出了问题&#xff0c;可以直接看我给出的倒数第二篇文章&a…

C++面试:MySQL服务器的安装与配置数据表的新建、查询和删除操作

MySQL服务器的安装与配置 安装 下载MySQL服务器&#xff1a;可以从MySQL的官方网站下载适合你操作系统的版本。安装MySQL&#xff1a; 在Windows上&#xff0c;通常是通过一个安装向导进行安装。在Linux上&#xff0c;可以通过包管理器进行安装&#xff0c;例如使用APT&#…

C++ Qt开发:运用QJSON模块解析数据

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QJson组件的实现对JSON文本的灵活解析…

QT问题记录:Qt报错msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

方法一&#xff1a;清空构建目录 重新设置一个新的构建目录&#xff08;影子目录&#xff09;&#xff0c;或者清空当前目录的所有文件即可 方法二&#xff1a;修改配置文件&#xff08;不推荐&#xff09; 网上大部分的解决方案都是这个&#xff0c;直接打开找到并文件msvc…

iTunes Connect 中修改后的内购(IPA)审核所需的时间

引言 在 iOS 开发过程中&#xff0c;将应用上传到 App Store 是一个重要的步骤。应用审核和 IAP 商品审核是分开的&#xff0c;审核一般需要等待一周左右。如果审核通过&#xff0c;我们会收到 Apple 发来的反馈邮件&#xff0c;根据邮件中的指示进行后续操作。如果已经上架的…

向日葵企业“云策略”升级 支持Android 被控策略设置

此前&#xff0c;贝锐向日葵推出了适配PC企业客户端的云策略功能&#xff0c;这一功能支持管理平台统一修改设备设置&#xff0c;上万设备实时下发实时生效&#xff0c;很好的解决了当远程控制方案部署后&#xff0c;想要灵活调整配置需要逐台手工操作的痛点&#xff0c;大幅提…

服务器故障处理 | 浪潮SA5212H5服务器排查出现故障的内存条

服务器故障处理 | 浪潮SA5212H5服务器排查出现故障的内存条 浪潮SA5212H5服务器管理界面如下:    这个型号的浪潮服务器很特殊,没有内存条的硬件信息,也没有具体哪个位置的内存条出现故障,接下来需要去操作系统层面查看具体的信息。 为了摸清是哪些内存出了问题,…

GPT-4 Vision根据应用程序截图生成博客和Readme 升级Streamlit八

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…