У меня есть настроенный QGraphicScene с некоторым QGraphicsItem QGraphicsLine и т. Д. Тот же способ показал на диаграмме пример Qt. Есть ли способ сохранить его в файл, а затем при необходимости открыть и повторно использовать или изменить его?
Работа на 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)
Нет прямого способа сохранить QGraphicsItem или производный класс в файл.
Что вам нужно сделать, так это перебрать каждый элемент и сохранить его свойства, которые затем вы можете прочитать обратно и воссоздать сцену.