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();
  }
}
相关推荐
草莓熊Lotso25 分钟前
【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
c语言·开发语言·经验分享·笔记·其他
盛夏绽放27 分钟前
Python字符串常用内置函数详解
服务器·开发语言·python
我想睡觉26127 分钟前
Python训练营打卡DAY27
开发语言·python·机器学习
想做后端的小C1 小时前
C# 面向对象 构造函数带参无参细节解析
开发语言·c#·面向对象
炯哈哈1 小时前
【上位机——WPF】App.xml和Application类简介
xml·开发语言·c#·wpf·上位机
LallanaLee1 小时前
常见面试题
java·开发语言
酷炫码神1 小时前
C#运算符
开发语言·c#
小秋学嵌入式-不读研版1 小时前
C42-作业练习
c语言·开发语言·笔记
凯雀安全1 小时前
printspoofer的RPC调用接口的简单代码
qt·网络协议·rpc
休息一下接着来2 小时前
C++ 条件变量与线程通知机制:std::condition_variable
开发语言·c++·算法