将包含子元素的整个QGraphicSscene保存到文件中

时间:2014-10-10 13:16:35

标签: python c++ qt pyqt pyqt4

我有一个定制的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)

1 个答案:

答案 0 :(得分:2)

没有直接的方法将QGraphicsItem或派生类保存到文件中。

您需要做的是遍历每个项目并保存其属性,然后您可以读回并重新创建场景。