【问题标题】:Preserve QStandardItem subclasses in drag and drop在拖放中保留 QStandardItem 子类
【发布时间】:2016-11-03 23:59:20
【问题描述】:

我有:

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。

拖放时如何保持item的原始类?

【问题讨论】:

  • @ekhumoro 感谢您的解决方案!您的链接中的解决方案有效,但前提是我有 1 个自定义类。如何使用 2 个自定义类?子类QStandardItemA & 子类QStandardItemB
  • 在这种情况下,您将需要采取不同的方法 - 请参阅我的答案以了解一种可能性。

标签: python drag-and-drop pyqt pyqt5 qstandarditem


【解决方案1】:

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)

【讨论】:

  • 我尝试了该代码,但出现错误。 AttributeError: type object 'QStandardItem' has no attribute 'UserData' 然后我用 UserType 替换了 UserData,这在某些情况下有效,但我仍然感到困惑......如果我要在 init self 中设置.userCustomStuff = 一些东西,然后我想把它带到新丢弃的项目中......我使用 type/setType 吗?或者我需要数据/setData?你知道用 pyqt /pyside 方式解释它的任何地方吗?
  • @Dariusz。我修复了代码示例。正如我在回答中解释的那样,只有项目标志和项目数据在拖放中传输。其他任何事情都被完全忽略。因此,您必须将setData 与自定义用户数据的自定义角色一起使用(这正是type 在我的示例中的工作方式)。如果你想要python风格的属性,你可以用@property来实现。
  • 只是想让你知道,直到现在(当我开始使用 C++ Qt 时)(几乎)一年之后,我才真正理解了你的意思,我喜欢它,哈哈。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多