话不多说,先上图
在自定义model中实现dropMimeData、supportedDropActions、mimeData三个函数。
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
Qt::DropActions supportedDropActions() const override;
virtual QMimeData *mimeData(const QModelIndexList &indexes) const override;
bool TreeModel::dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent)
{
QByteArray array = data->data(QString("hehe"));
QDataStream stream(&array, QIODevice::ReadOnly);
qint64 p;
stream >> p;
QModelIndex* index = (QModelIndex*)p;
TreeItem* item = static_cast<TreeItem*>(index->internalPointer());
TreeItem* ParentItem = static_cast<TreeItem*>(parent.internalPointer());
beginMoveRows(index->parent(), index->row(), index->row(), parent, ParentItem->childRows());
item->ParentItem()->RemoveItem(item->row());
ParentItem->AddChild(item);
endMoveRows();
delete index;
return false;
}
Qt::DropActions TreeModel::supportedDropActions() const
{
return Qt::MoveAction;
}
QMimeData * TreeModel::mimeData(const QModelIndexList & indexes) const
{
QMimeData* mimeData = QAbstractItemModel::mimeData(indexes);
//只取第一个
for (int i = 0; i < indexes.count(); i++)
{
QModelIndex index = indexes[i];
QModelIndex* p = new QModelIndex(index);
TreeItem* item = static_cast<TreeItem*>(index.internalPointer());
qDebug() << item->data(Qt::DisplayRole).toString();
QByteArray array;
QDataStream stream(&array, QIODevice::WriteOnly);
stream << (qint64)p;
mimeData->setData(QString("hehe"), array);
return mimeData;
}
return mimeData;
}
设置treeview可拖动以及拖动模式等
ui->treeView->setDragEnabled(true); //允许拖拽
ui->treeView->setDragDropMode(QAbstractItemView::InternalMove); //拖放模式为移动
ui->treeView->setDropIndicatorShown(true); //显示拖放位置
也可以在设计师里进行勾选
源代码链接