拖放保留QStandardItem子类

发布于 2021-01-29 17:31:03

我有:

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。

拖放时如何保持项目的原始类别?

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    正如在解释这个答案,你可以使用setItemPrototype提供项目工厂的典范。但是,正如答案中所述,在拖放操作期间仅传输某些类型的信息。对于a
    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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看