4
我一直在小心翼翼地学习如何用QTreeView和自定义Item类实现QAbstractItemModel,并且除拖放操作外,其他所有工作都已完成。在QAbstractItemModel中拖放PySide PyQt
最后,我希望能够与Shift键移动和复制项目之间进行切换,但现在我只是试图让InternalMove在所有的工作....
我再实施mimeData和dropMimeData这样....
class BuildModel(QAbstractItemModel):
def __init__(self, root):
super(BuildModel, self).__init__()
def mimeTypes(self):
return ['sushi-build-items']
def mimeData(self, indices):
mimedata = QMimeData()
mimedata.setData('sushi-build-items', self.getSerializedData(indices))
return mimedata
def dropMimeData(self, mimedata, action, row, column, parentIndex):
if not mimedata.hasFormat('sushi-build-items'):
return False
data = pickle.loads((str(mimedata.data('sushi-build-items'))))
items = dataToItems(data)
self.insertItems(row, items, parentIndex)
return True
def insertItems(self, row, items, parentIndex):
parent = self.itemFromIndex(parentIndex)
self.beginInsertRows(parentIndex, row, row+len(items)-1)
if row == -1:
parent.addChildren(items)
else:
parent.insertChildren(row, items)
self.endInsertRows()
self.dataChanged.emit(parentIndex, parentIndex)
return True
而且我的树视图设置为InternalMove这样....
class TreeView(QTreeView):
def __init__(self, parent = None, model = None):
super(TreeView, self).__init__(parent = parent)
self.setDragDropMode(QAbstractItemView.InternalMove)
self.setDragEnabled(True)
self.setAcceptDrops(True)
但是,当我拖放源项逗留它就是这样,它只是丢弃一个重复的项目。 不应该删除被拖动的项目由TreeView处理?如果不是我在哪里手动删除它?
我相信我在这里失去了一些东西..
尝试实施虚拟'moveRows'和'removeRows'方法,并检查它们在拖动过程中是否被视图调用。你也一定需要实现'supportedDropActions'来返回'Qt.MoveAction | Qt.CopyAction'。 –
如前所述,'def supportedDropActions(self):return QtCore.Qt.MoveAction | QtCore.Qt.CopyAction'为我做了窍门。很高兴知道,因为我没有在文档中看到它。 –