python drag-and-drop pyqt pyqt5 qstandarditem

python - Preserve las subclases QStandardItem en arrastrar y soltar



drag-and-drop pyqt (1)

Como se explica en esta respuesta , puede usar setItemPrototype para proporcionar una fábrica de elementos 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 banderas del artículo y los datos del artículo . No hay forma de conservar la subclase específica del elemento si se usan múltiples subclases. Un modelo puede tener solo un prototipo y se usa para todos los elementos creados internamente por Qt.

Esto significa que no debe usar múltiples subclases QStandardItem si necesita distinguir entre diferentes tipos de elementos. En su lugar, debe usar una única subclase y volver a implementar QStandardItem.type para distinguirlas:

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)

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 elemento B al elemento A y verifico su clase, el ItemB ya no es un SubclassQStandardItemB sino un QStandardItem.

¿Cómo puedo mantener la clase original del artículo cuando lo arrastro y suelto?