问题描述
我有一个带有QSortFilterProxyModel的QListView。施工完成后,我致电:
self.usersListView.setDragEnabled(True)
self.usersListView.setAcceptDrops(True)
self.usersListView.setDropIndicatorShown(True)
self.usersListView.setDefaultDropAction(QtCore.Qt.MoveAction)
在模型中,我重载了flags()
方法来设置ItemIsDragEnabled和ItemIsDropEnabled。我实现了mimeTypes()
,mimeData()
,dropMimeData()
,因为文档说您需要使用Model-View进行拖放。我也有:
def supportedDropActions(self):
return QtCore.Qt.MoveAction | QtCore.Qt.CopyAction
我可以选择并拖动QListView中的所有项目。但是掉落指示器始终是一个阻塞圈,不允许掉落。为了调试,我添加了
def canDropMimeData(self,data,action,row,column,parent):
logger.info(__("UsersModel.dropMimeData(data={0},action={1},row={2},column={3},parent={4})",parent))
return True
仅使用该方法,放置指示符就可以接受并且可以发生放置。记录器向我显示:
2020-09-15 13:44:31,418 INFO UsersModel.canDropMimeData(data=<PySide2.QtCore.QMimeData(0x1d7d1e0) at 0x7f6b012cc100>,action=PySide2.QtCore.Qt.DropAction.CopyAction,row=-1,column=-1,parent=<PySide2.QtCore.QModelIndex(3,1,0x1db8930,UsersModel(0x1da87f0)) at 0x7f6b0130e840>)
该操作是一个CopyAction,而不是defaultDropAction指示的MoveAction。
所以我有2个问题:
-
为什么需要实现
canDropMimeData()
?文档说这是可选的,以便更好地控制掉线。设置acceptDrops
就足够了。 -
默认情况下如何获取MoveAction?这种情况实际上仅支持MoveAction。在我的上下文中,CopyAction没有任何意义。
PS:相同的代码在QT4 / PySide中工作。我只是将其调整为QT5 / PySide2。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)