QFileSystemModel 拖拽到其他QTreeView当中

研究之后发现这种拖拽在任意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);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值