この質問は、このトピックの質問に似ていますドラッグアンドドロップでQStandardItemサブクラスを保持しますが、適切な解決策が見つからないという問題があります。そのトピックは部分的に役立ちますが、より複雑なタスクでは失敗します。
QTreeView でアイテムを作成すると、そのアイテムが配列に配置されますが、ドラッグ アンド ドロップを使用するとアイテムが削除され、アクセスできなくなります。ドラッグ アンド ドロップは項目を移動せずにコピーするため、setData を使用する必要があることはわかっています。オブジェクトがコピーされ、それへの参照が失われるため、setDataをオブジェクトにすることはできません。
ここに例があります
itemsArray = self.addNewRow
def addNewRow(self)
'''some code with more items'''
itemHolder = QStandardItem("ProgressBarItem")
widget = QProgressBar()
itemHolder.setData(widget)
inx = self.model.rowCount()
self.model.setItem(inx, 0, itemIcon)
self.model.setItem(inx, 1, itemName)
self.model.setItem(inx, 2, itemHolder)
ix = self.model.index(inx,2,QModelIndex())
self.treeView.setIndexWidget(ix, widget)
return [itemHolder, itemA, itemB, itemC]
#Simplified functionality
data = [xxx,xxx,xxx]
for items in itemsArray:
items[0].data().setPercentage(data[0])
items[1].data().setText(data[1])
items[2].data().setChecked(data[2])
上記のコードは、ウィジェットを移動しない場合に機能します。2 回目にドラッグ アンド ドロップすると参照が失われ、すべてのアイテムの更新が失われ、クラッシュします。
RuntimeError: wrapped C/C++ object of type QProgressBar has been deleted
この問題を解決する方法として考えられるのは、ツリービュー全体を各行/子および名前一致の更新項目で再帰的にループすることです.... -各15アイテム。意味...非常に高速/効率的ではないと思います...0.5秒ごとに5000アイテムをループしたい場合...
この問題を解決する方法を誰かが提案できますか? おそらく、ドロップイベントを編集して、アイテムをコピー/貼り付けするのではなく、アイテムを移動することができます....このようにして、配列内のオブジェクトを失うことはありません