2016-11-03 11 views
1

をドロップ:私はitemAにitemB移動し、そのクラスをチェックするとがドラッグで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はもはやSubclassQStandardItemBしかしQStandardItemではありません。

ドラッグアンドドロップするとアイテムの元のクラスを維持できますか?

+0

!あなたのリンクのソリューションが動作しますが、カスタムクラスが1つしかない場合に限ります。 2つのカスタムクラスを使ってどのように作業できますか? SubclassQStandardItemA&SubclassQStandardItemB – Dariusz

+0

その場合、別のアプローチをとる必要があります。私の答えは1つの可能性について見てください。 – ekhumoro

答えて

1

this answerで説明したように、setItemPrototypeを使用してモデルのアイテムファクトリを提供できます。しかし、答えにも記載されているように、特定の種類の情報だけがドラッグアンドドロップ操作中に転送されます。 QStandardItemの場合、これはitem flagsitem dataのみを意味します。複数のサブクラスが使用されている場合、項目の特定のサブクラスを保持する方法はありません。モデルはプロトタイプを1つだけ持つことができ、Qtによって内部的に作成されたすべてのアイテムに使用されます。

異なるアイテムタイプを区別する必要がある場合は、複数のQStandardItemサブクラスを使用しないでください。代わりに、あなたは、単一のサブクラスを使用し、それらを区別するためにQStandardItem.typeを再実装する必要があります解決してくれてありがとう@ekhumoro

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) 
+0

そのコードを試しましたが、エラーが発生しました。私は__init__のself.userCustomStuff =何かを設定していたのですが、何か問題があった場合は、私はそれを新しいドロップされた項目に取りたいと思います...タイプ/ setTypeを使用しますか?または私はデータ/ setDataが必要ですか?あなたはおそらくpyqt/pysideの方法でそれを説明する任意の場所を知っていますか? – Dariusz

+1

@Dariusz。コード例を修正しました。私の答えで説明したように、アイテムフラグとアイテムデータだけがドラッグドロップで転送されます。それ以外は完全に無視されます。ですから、カスタムユーザデータのカスタムロールで 'setData'を使う必要があります(これは私の例で' type'がどのように動作するかです)。 Pythonスタイルの属性が必要な場合は、[@ property](http://docs.python.org/3/library/functions.html#property)で実装できます。 – ekhumoro

+0

ちょうど今(私がC + + Qtをやってから)1年後には、実際にはあなたが意味することを実際に正しく理解していて、私はそれが大好きだということを知らせたいと思っています。ありがとう! – Dariusz

関連する問題