Сохранить подклассы QStandardItem в режиме перетаскивания
Я имею:
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)
Когда я перемещаю itemB в itemA и проверяю его класс, ItemB больше не SubclassQStandardItemB, а QStandardItem.
Как сохранить исходный класс элемента при перетаскивании?
1 ответ
Как объясняется в этом ответе, вы можете использовать setItemPrototype, чтобы предоставить фабрику элементов для модели. Однако, как указано в ответе, во время операции перетаскивания передаются только определенные виды информации. Для QStandardItem
, это означает только флаги элемента и данные элемента. Невозможно сохранить определенный подкласс элемента, если используется несколько подклассов. Модель может иметь только один прототип, который используется для всех элементов, которые создаются внутри Qt.
Это означает, что вы не должны использовать несколько QStandardItem
подклассы, если вам нужно различать разные типы элементов. Вместо этого вы должны использовать один подкласс и переопределить QStandardItem.type, чтобы различать их:
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)