【发布时间】:2016-11-06 17:38:47
【问题描述】:
这个问题与本主题 Preserve QStandardItem subclasses in drag and drop 中的问题类似,但我无法找到一个好的解决方案。该主题对更复杂的任务有部分帮助,但失败了。
当我在 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])
如果我不移动小部件,上面的代码就可以工作。第二次我拖放我失去参考我失去了我所有项目的更新,我得到了崩溃。
RuntimeError: wrapped C/C++ object of type QProgressBar has been deleted
我能想到的解决此问题的方法是在每个行/子项上递归遍历整个树视图,并在名称匹配更新项上循环......问题是我将每 0.5 秒刷新一次树视图,并且有 500 多个每行有 5-15 个项目。意思...我认为这不会非常快速/高效...如果我想每 0.5 秒循环超过 5 000 个项目...
有人能建议我如何解决这个问题吗?也许我可以编辑 dropEvent 所以它不会复制/粘贴项目而是移动项目....这样我就不会丢失数组中的对象
【问题讨论】:
标签: python qt qtreeview qstandarditemmodel qstandarditem