2014-04-01 75 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方法;它应该被自动调用。