QListView忽略acceptDrops和defaultDropAction

问题描述

我有一个带有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个问题:

  1. 为什么需要实现canDropMimeData()?文档说这是可选的,以便更好地控制掉线。设置acceptDrops就足够了。

  2. 默认情况下如何获取MoveAction?这种情况实际上仅支持MoveAction。在我的上下文中,CopyAction没有任何意义。

PS:相同的代码在QT4 / PySide中工作。我只是将其调整为QT5 / PySide2。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)