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();
  }
}
相关推荐
MediaTea10 分钟前
大学 Python 编程基础(合集)
开发语言·python
墨雪不会编程11 分钟前
C++ string 详解:STL 字符串容器的使用技巧
java·开发语言·c++
悲喜自渡72114 分钟前
Python 编程(gem5 )
java·linux·开发语言
运维行者_1 小时前
OPM 与传统管理工具的区别,在网络修复与自动化运维方面的优势在哪里?
运维·服务器·开发语言·网络·自动化·php·ssl
广州灵眸科技有限公司2 小时前
瑞芯微(EASY EAI)RV1126B 音频输入
linux·开发语言·网络·音视频
吃喝不愁霸王餐APP开发者2 小时前
基于Spring Cloud Gateway实现对外卖API请求的统一鉴权与流量染色
java·开发语言
心疼你的一切3 小时前
三菱FX5U PLC与C#通信开发指南
开发语言·单片机·c#
Tim_103 小时前
【C++入门】04、C++浮点型
开发语言·c++
@淡 定3 小时前
Java内存模型(JMM)详解
java·开发语言
谈笑也风生3 小时前
经典算法题型之复数乘法(二)
开发语言·python·算法