研究之后发现这种拖拽在任意model当中都是通用的,这边实现了把QFileSystemModel 当中的文件路径信息拖拽到其他QTreeView当中,其他信息也是可以拖拽的。直接上代码,写的比较粗糙,遇到问题直接来问w
继承重写QFileSystemModel
Qt::DropActions supportedDropActions() const override;
QStringList mimeTypes() const override;
virtual QMimeData *mimeData(const QModelIndexList &indexes) const override;
Qt::DropActions FileSystemModel::supportedDropActions() const
{
return Qt::CopyAction;
}
QMimeData *FileSystemModel::mimeData(const QModelIndexList &indexes) const
{
if (indexes.count() <= 0)
{
return 0;
}
// 只取第一个
QModelIndex index = indexes[0];
QMimeData *data = QAbstractItemModel::mimeData(indexes);
QList<QUrl> url_list;
data->setUrls(url_list << filePath(index));
return data;
}
继承重写拖拽入的QTreeView的Model
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex())override;
Qt::DropActions supportedDropActions() const override;
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
bool LeftCenterFavBarModel::removeRows(int row, int count, const QModelIndex &parent)
{
return QStandardItemModel::removeRows(row, count, parent);
}
Qt::DropActions LeftCenterFavBarModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction;
}
// 我这里是只会在QTreeView最后一行新增,你可以根据你的需要改着写
bool LeftCenterFavBarModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
// 只能并列存放
if (row == -1)
{
row = parent.row();
// 拖入到空白,新增一行
if (row == -1)
{
row = rowCount();
}
}
// 有路径
if (data->hasUrls())
{
QString path = data->urls().first().toString();
// 解决c:/与C:/不同导致的路径不匹配bug
if (path[0] >= 'a' && path[0] <= 'z')
{
path[0] = path[0].toUpper();
}
// 遍历当前是否有重复文件夹,若是,则删除原文件夹(移动)
int rows = rowCount();
for (int i = 0; i < rows; i++)
{
if (index(i, 2).data().toString() == path)
{
removeRow(i, index(i, 2).parent());
row--;
break;
}
}
// 加入在当前row之下
QList<QStandardItem *> item_list;
item_list << new QStandardItem(path.split('/').last())
<< new QStandardItem()
<< new QStandardItem(path);
insertRow(row, item_list);
return true;
}
else
{
return false;
}
}
QFileSystemModel 所在QTreeView当中:
// 设置允许拖拽(不接收拖入)
setDragDropMode(QAbstractItemView::DragOnly);
要拖拽入的QTreeView当中:
void dragEnterEvent(QDragEnterEvent *event)override;
void dragMoveEvent(QDragMoveEvent *event)override;
void dropEvent(QDropEvent *event)override;
// 取消拖拽时虚线外框标志(可不选)
setDropIndicatorShown(false);
// 允许接受拖拽事件
setDragDropMode(QAbstractItemView::DragDrop);
void HPLeftCenterFavBar::dragEnterEvent(QDragEnterEvent *event)
{
//判断拖拽类型,只接收文件夹 接收该动作
if (event->mimeData()->hasFormat("text/uri-list")
&& !QFileInfo(event->mimeData()->urls().first().toString().replace("file:///", "")).isFile())
{
event->accept();
return;
}
else
{
event->ignore();
return;
}
QTreeView::dragEnterEvent(event);
}
void HPLeftCenterFavBar::dragMoveEvent(QDragMoveEvent *event)
{
event->accept();
return;
}
void HPLeftCenterFavBar::dropEvent(QDropEvent *event)
{
QTreeView::dropEvent(event);
}