2014-04-01 76 views
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處理?如果不是我在哪裏手動刪除它?

我相信我在這裏失去了一些東西..

+1

嘗試實施虛擬'moveRows'和'removeRows'方法,並檢查它們在拖動過程中是否被視圖調用。你也一定需要實現'supportedDropActions'來返回'Qt.MoveAction | Qt.CopyAction'。 –

+0

如前所述,'def supportedDropActions(self):return QtCore.Qt.MoveAction | QtCore.Qt.CopyAction'爲我做了竅門。很高興知道,因爲我沒有在文檔中看到它。 –

回答

3

您需要實現在模型中removeRows方法;它應該被自動調用。