1

私は持っている:

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 になっています。

ドラッグ アンド ドロップ時にアイテムの元のクラスを保持するにはどうすればよいですか?

4

1 に答える 1

1

この回答で説明されているように、 setItemPrototypeを使用してモデルのアイテム ファクトリを提供できます。ただし、回答にも記載されているように、ドラッグアンドドロップ操作中に特定の種類の情報のみが転送されます。の場合、これはアイテム フラグアイテム データQStandardItemのみを意味します。複数のサブクラスが使用されている場合、アイテムの特定のサブクラスを保持する方法はありません。モデルは 1 つのプロトタイプしか持つことができず、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)
于 2016-11-04T14:35:01.177 に答える