qt QTreeWidget文件管理器拖入应用,从应用拖入文件管理器拷贝

我用QT实现了一个文件管理的软件,能够实现从桌面或其他路径拖拽文件到软件,软件获取拖拽文件的路径。但是当我想实现反向操作时遇到了问题。在网上搜索和阅读文档一天多都未能解决该问题。

下面给出我的实现:

Qt开发中经常会用QTreeWidget去显示文件夹内容,将文件拖出到资源管理器并拷贝是必要的功能。

对mimeData方法的重写是实现文件拖出拷贝的关键所在。

cpp 复制代码
class TreeWidget : public QTreeWidget
{
    Q_OBJECT
public:
    TreeWidget(QWidget *parent = nullptr);
    ~TreeWidget();

protected:
    void dragEnterEvent(QDragEnterEvent *e);
    void dragMoveEvent(QDragMoveEvent *e);
    void dropEvent(QDropEvent *e);

    QMimeData mimeData(const QList<QTreeWidgetItem > &items) const override;
};

TreeWidget::TreeWidget(QWidget *parent) :
    QTreeWidget(parent)
{
    this->setSelectionMode(QAbstractItemView::SingleSelection);
    this->setDragEnabled(true);
    this->setAcceptDrops(true);
    this->viewport()->setAcceptDrops(true);
    this->setDragDropMode(QAbstractItemView::DragDrop);
    this->setDropIndicatorShown(true);
    this->setContextMenuPolicy(Qt::CustomContextMenu);
    this->setHeaderHidden(true);
}

/*
 * 从软件文件列表拖拽到其他地方实现文件拷贝
 * 这里负责设置mimeData,松手时如果Item的mimeData没有内容的话或者内容不是本机url时无法实现拷贝功能。
 */
QMimeData  TreeWidget::mimeData(const QList<QTreeWidgetItem > &items) const
{
    QList<QUrl> urls;
    QMimeData *mimeData = new QMimeData();

    foreach (QTreeWidgetItem *item, items)
    {
    	/* 获取拖动item的对应文件的路径,这里替换为你想拷贝的路径 */
        QString savePath = tempdir->path() + "/" + item->text(1);
        QUrl url = QUrl::fromLocalFile(savePath);
        urls.push_back(url);
    }

    mimeData->setUrls(urls);
    return mimeData;
}

void TreeWidget::dragEnterEvent(QDragEnterEvent *e)
{
    if(e->mimeData()->hasUrls())
    {
        e->acceptProposedAction();
    }
    else
    {
        e->ignore();
    }
}

void TreeWidget::dropEvent(QDropEvent *e)

{
  QList<QUrl> urls = e->mimeData()->urls();

  foreach (QUrl url, urls) {
        QString filepath = url.toLocalFile();
  }
}
相关推荐
AI+程序员在路上1 小时前
VS Code 完全使用指南:下载、安装、核心功能与 内置AI 编程助手实战
开发语言·人工智能·windows·开源
invicinble1 小时前
这里对java的知识体系做一个全域的介绍
java·开发语言·python
catchadmin1 小时前
使用 PHP TrueAsync 改造 Laravel 协程异步化的可行路径
开发语言·php·laravel
wbs_scy1 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·开发语言
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
郑州光合科技余经理2 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
南子北游3 小时前
Python学习(基础语法1)
开发语言·python·学习
张健11564096483 小时前
使用信号量限制并发数量
开发语言·c++
糯米团子7494 小时前
Web Worker
开发语言·前端·javascript
我命由我123454 小时前
JavaScript 开发 - 获取函数名称、获取函数参数数量、获取函数参数名称
开发语言·前端·javascript·css·html·html5·js