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();
  }
}
相关推荐
侃侃_天下19 小时前
最终的信号类
开发语言·c++·算法
echoarts20 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix20 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题20 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说21 小时前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔21 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号21 小时前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_21 小时前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty21 小时前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再1 天前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame