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'爲我做了竅門。很高興知道,因爲我沒有在文檔中看到它。 –