我有:
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。
如何在拖放时保留项目的原始类?
发布于 2016-11-04 14:35:01
正如在这个答案中解释的那样,您可以使用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)https://stackoverflow.com/questions/40413221
复制相似问题