我有一个定制的QGraphicScene,上面有一些QGraphicsItem QGraphicsLine等。同样的方式显示在qt的diagramcene示例中。有没有办法可以将它保存到文件中,以后需要打开并重新使用或修改它? 使用PyQt4,但qt4相关性(c ++而不是python)的答案也是受欢迎的。
这实际上是保存并重新创建。
##want to save the scene
elif key == QtCore.Qt.Key_S and modifier == QtCore.Qt.ControlModifier:
#saving all the items in the current scene
self.arrowItemVec=[]
self.allItems=self.scene.items()
#for arrow we need the start and end item to recreate
#for now only saving the names
for item in self.allItems:
if 'Arrow'==item.__class__.__name__:
self.arrowItemVec.append([item.startItem().name,item.endItem().name])
elif key == QtCore.Qt.Key_L and modifier == QtCore.Qt.ControlModifier:
#recreating all the saved items
#if the scene is cleared before creating new items. we
#loose the old item positions
#essentially we need to save the complete scene
#detect what item it was and then recreate it
newItemVec=[]
for item in self.allItems:
if 'DiagramItem'==item.__class__.__name__:
newItem=DiagramItem(diagramType=item.diagramType,contextMenu=None)
newItem.name=item.name
newItem.signaller.showChild.connect(self.showChildGraph)
newItemVec.append(newItem)
newItem.setPos(item.pos().x()+10,item.pos().y()+10)
#else:
#print(item.__class__.__name__)
count=0
for item in self.allItems:
if 'Arrow'==item.__class__.__name__:
for newItem in newItemVec:
if newItem.name==self.arrowItemVec[count][0]:
startItem=newItem
if newItem.name==self.arrowItemVec[count][1]:
endItem=newItem
count+=1
newArrow=Arrow(startItem,endItem)
newArrow.setZValue(1000)
newItemVec.append(newArrow)
self.scene.clear()
self.scene.addGrid()
for item in newItemVec:
self.scene.addItem(item)
答案 0 :(得分:2)
没有直接的方法将QGraphicsItem或派生类保存到文件中。
您需要做的是遍历每个项目并保存其属性,然后您可以读回并重新创建场景。