编程语言
首页 > 编程语言> > python – 拖放时保留QStandardItem子类

python – 拖放时保留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.

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

解决方法:

this answer中所述,您可以使用setItemPrototype为模型提供项目工厂.但是,如答案中所述,在拖放操作期间仅传输某些类型的信息.对于QStandardItem,这仅表示item flagsitem data.如果使用多个子类,则无法保留项的特定子类.模型只能有一个原型,并且用于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)

标签:pyqt5,python,drag-and-drop,pyqt,qstandarditem
来源: https://codeday.me/bug/20190929/1831813.html