Preserve QStandardItem subclasses in drag and drop

后端 未结 1 860
野的像风
野的像风 2020-12-11 12:29

I have:

self.treeView = QTreeView()
self.treeView.setObjectName(\"testView\")
self.treeView.setDragDropMode(QAbstractItemView.InternalMove)
self.treeView.set         


        
相关标签:
1条回答
  • 2020-12-11 13:29

    As explained in this answer, you can use setItemPrototype to provide an item factory for a model. However, as also stated in the answer, only certain kinds of information are transferred during a drag and drop operation. For a QStandardItem, this means only the item flags and item data. There is no way to preserve the specific subclass of the item if there are multiple subclasses being used. A model can have only one prototype, and that is used for all items that are created internally by Qt.

    This means you should not use multiple QStandardItem subclasses if you need to distinguish between different item types. Instead, you should use a single subclass and reimplement QStandardItem.type to distinguish between them:

    class MyItem(QtGui.QStandardItem):
        TypeItemA = QtGui.QStandardItem.UserType
        TypeItemB = QtGui.QStandardItem.UserType + 1
        TypeItemC = QtGui.QStandardItem.UserType + 2
    
        def clone(self):
            return MyItem()
    
        def type(self):
            return self.data(QtCore.Qt.UserRole + 1000)
    
        def setType(self, value):
            self.setData(QtCore.Qt.UserRole + 1000, value)
    
    ...
    
    itemA = MyItem(self)
    itemA.setType(MyItem.TypeItemA)
    itemB = MyItem(self)
    itemB.setType(MyItem.TypeItemB)
    
    0 讨论(0)
提交回复
热议问题