这个问题与本主题中的问题相似Preserve QStandardItem subclasses in drag and drop,但问题是我找不到一个好的解决方案。这个话题对更复杂的任务有部分帮助,但失败了。在
当我在QTreeView中创建一个项目时,我将该项目放入我的数组中,但当我使用拖放操作时,该项目将被删除,我不再有权访问它。我知道这是因为拖放复制了项目而不是移动它,所以我应该使用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])
如果我不移动小部件,上面的代码可以工作。第二次我拖放我失去了参考,我失去了所有项目的更新,我得到崩溃。在
^{pr2}$解决这个问题的方法是递归地循环整个treeview,遍历每一行/子项和名称匹配更新项。。。。问题是,我将每0.5秒刷新一次treeview,并且有500多行,每行有5-15项。意思是。。。我不认为那会很快/有效。。。如果我想每0.5秒循环超过5000个项目。。。在
有人能建议我怎么解决这个问题吗?也许我可以编辑dropEvent,这样它不会复制/粘贴项目,而是移动项目。。。。这样我就不会在数组中丢失我的对象
Qt只能序列化可以存储在
QVariant
中的对象,因此这对QWidget
不起作用也就不足为奇了。但是,即使它可以序列化小部件,我仍然认为它不起作用,因为索引小部件属于视图,而不是模型。在总之,我认为您必须分别保存对小部件的引用,并且只在模型项中存储一个简单的键。然后,一旦项目被删除,您就可以检索小部件并在视图中重置它们。在
下面是一个有效的演示脚本:
相关问题 更多 >
编程相关推荐