我用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();
}
}