拖放操作分为拖动(Drag)和放置(Drop)两种操作,当拖动时需要把拖动的数据进行存储(称为编码),数据存储为QMimeData类型的对象(称为放置数据),当执行放置操作时需要把存储的数据读取出来(称为解码),然后进行处理。
自定义拖放操作的步骤:
(1)启用视图拖放支持
ui->treeView->setDragEnabled(true); //允许拖放,默认未启用
ui->treeView->setAcceptDrops(true); //接受放置数据
ui->treeView->setDragDropMode(QAbstractItemView::InternalMove); //拖放模式为移动
ui->treeView->setDropIndicatorShown(true); //显示拖放位置
ui->treeView->setDragDropOverwriteMode(true); //放下时覆盖已有项
(2)启用数据项的拖放支持
重新实现QAbstractItemModel::flags()函数以提供合适的标志来指示哪些项目可以被拖动,哪些项目将接受放置(Drop)。
(3)编码数据
重新实现QAbstractItemModel::mimeData()函数,把编码后的数据保存在该函数返回的QMimeData对象中。
(4)处理放置数据
重新实现QAbstractItemModel::dropMimeData()函数来处理放置数据,此时需要对放置数据进行解码(即读取出QMimeData对象存储的数据的内容),并将其插入模型的底层数据结构中(或进行其他处理),若该函数修改了数据项或模型的尺寸,则必须注意确保发出所有相关的信号。因为该函数需要插入或删除等操作,所以简单的调用QAbstractItemModel子类中的已经实现了的s

本文详细介绍了如何在Qt中实现自定义拖放操作,包括启用视图支持、设置数据项拖放标志、编码QMimeData和处理Drop事件。通过实例展示了如何在TreeView中重新实现关键函数,如dropMimeData和mimeData,以支持数据的移动和存储。
5494

被折叠的 条评论
为什么被折叠?



