Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言:
QListWidget、QTableWidget和QTreeWidget中每一种类型的项目都默认配置了一组不同的标签。比如,每一个QListWidgetItem和QTreeWidgetItem都可以被初始化为可用的、可检查的、可选择的、可以用作拖放操作的。而每一个QTableWidgetItem可以被编辑和用作拖放操作。尽管所有的标准项目都有一个或者两个标志来设置拖放,但是,一般还是需要在视图中设置一些属性来启用拖放。
- 将视图的dragEnable属性设置为true;
- 允许用户将内部或者外部的项目放入视图中,需要设置视图的viewport()的acceptDrops属性为true;
- 要显示现在用户拖拽的项目将要被放置的位置,需要设置showDropIndicator属性。
启用拖放功能:
//设置选择模式为单选
listWidget.setSelectionMode(QAbstractItemView::SingleSelection);
//启用拖放
listWidget.setDragEnabled(true);
//设置接受拖放
listWidget.viewport()->setAcceptDrops(true);
//设置显示将要被放置的位置
listWidget.setDropIndicatorShown(true);
//设置拖放模式为移动项目,如果不设置,默认为复制项目
listWidget.setDragDropMode(QAbstractItemView::InternalMove);
上面这些代码实现了当拖拽一个项目到一个合适的位置时,会显示一条短线,表明项目可以放置在该位置,这就是showDropIndicator属性的作用。
实现拖放功能的其他方式:
除了使用视图自带的拖放方式,我们还可以通过重新实现便捷类,通过响应便捷类的QMousePressEvent、QMouseMoveEvent、QMouseReleaseEvent来实现选中一个项目,项目的移动,项目的插入。
当然除了需要重新实现鼠标的响应消息,我们还需要实现item的插入和删除工作,当只是实现item的位置运动时,我们需要删除原来的item,并在新的位置插入Item。
如果想要实现显示适合位置的短线,我们需要跟踪鼠标移动的位置,和item的位置做比较,如果移动到合适的位置,就显示一条短线,移出则隐藏短线。
如果在拖动时需要显示一个虚的被拖拽的item,还用到了Qt中的copy功能,这部分可以再去做了解。