Conservar las subclases de QStandardItem al arrastrar y soltar

Yo tengo:

self.treeView = QTreeView() self.treeView.setObjectName("testView") self.treeView.setDragDropMode(QAbstractItemView.InternalMove) self.treeView.setSelectionMode(QAbstractItemView.ExtendedSelection) itemA = SubclassQStandardItemA(self) itemB = SubcalssQStandardItemB(self) self.model = QStandardItemModel() self.treeView.setModel(self.model) self.model.appendRow(itemA) self.model.appendRow(itemB) 

Cuando muevo el itemB al itemA y reviso su clase, ItemB ya no es un SubclassQStandardItemB sino un QStandardItem.

¿Cómo puedo conservar la clase original del elemento cuando arrastro y suelto?

Como se explica en esta respuesta , puede usar setItemPrototype para proporcionar una fábrica de artículos para un modelo. Sin embargo, como también se indica en la respuesta, solo ciertos tipos de información se transfieren durante una operación de arrastrar y soltar. Para un QStandardItem , esto significa solo las QStandardItem del elemento y los datos del elemento . No hay forma de conservar la subclase específica del elemento si se están utilizando varias subclases. Un modelo solo puede tener un prototipo, y se usa para todos los elementos creados internamente por Qt.

Esto significa que no debe usar varias subclases de QStandardItem si necesita distinguir entre diferentes tipos de elementos. En su lugar, debe usar una sola subclase y volver a implementar QStandardItem.type para distinguirlos:

 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)