python - 在拖放中保留 QStandardItem 子类

标签 python drag-and-drop pyqt pyqt5 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 。如果使用多个子类,则无法保留该项目的特定子类。一个模型只能有一个原型(prototype),该原型(prototype)用于 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)

关于python - 在拖放中保留 QStandardItem 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413221/

相关文章:

android - Android 9 Pie 中的拖放崩溃

python - 控制窗口和显示窗口

Python 请求 set-cookie 未正确设置

python - 为什么打印制表符并不总是打印制表符而是打印空格?

python - 从 pandas 数据框中有效地提取行,我必须在其中搜索列表中的元素

javascript - jQuery 拖放插件不会将元素从其位置移动 - 只是制作副本?

python - PyQt5 在 Python 3.5 中调用 matplotlib.pyplot 时出现 "No module named ' PyQt 4'"错误

javascript - Html5 拖放,dragstart 后不触发 Mousewhell 事件

python - Pyqt:如何更改QGroupBox标题颜色?

python - PyQt。如何在 QTableView 中插入小部件