Qt QGraphicsScene复制

6
我有一个QGraphicsScene,我想复制并添加到列表的开头。最好的方法是什么?
QGraphicsScene* m_scene = new QGraphicsScene();
QGraphicsScene* m_DuplicateScene;

QList<QGraphicsScene *>m_list;

1
将元素追加到列表末尾,或在列表开头插入元素(有时称为prepend)?另外,你只想复制指针还是整个场景? - Caleb Huitt - cjhuitt
1
我想复制整个场景,并将其附加到列表中。 - Phil Hannent
2个回答

7
这样做会非常复杂,因为您对 m_scene 的子对象一无所知。即使您使用 dynamic_cast 并为每种类型的 QGraphicsItem 创建一个 clone() 函数,您仍然需要记住其他人可以继承 QGraphicsItem 并创建自己的图形项类型,这使得它们无法被您克隆。

基本上,不能复制 QGraphicsScene(同时克隆所有项目)。 甚至不能引用原始场景的子对象的子对象,因为 QGraphicsItem 只能有一个场景。

除非我错过了某个方法调用。 “clone”,“copy”和“duplicate”的搜索结果均未产生任何结果。

关于您的第二个问题,请使用 QList<T *>::push_front。 因此,m_list.push_frontm_DuplicateScene);

(副笔:您将项目添加到列表的开头,并将项目添加到列表的末尾。)


谢谢,我最终创建了一个序列化场景属性的方法,然后迭代场景对象并让它们自行序列化。虽然这样做很慢且需要很多工作,但确实能够正常运行。 - Phil Hannent

2
我在项目中复制了QGraphicsScene的项。我是用以下方式实现的,这可能会有所帮助。
我有一个类像这样:
class DiagramScene : public QGraphicsScene
{
[some datas]
}

还有另一个类似的类:
class DiagramItem : public QGraphicsItem
{
}

在复制函数中,我使用类似于以下代码的代码:

Diagram_Scene myScene;

foreach (QGraphicsItem *item, diagram_scene1->items()) 
{
    if(item->type() == DiagramItem::Type)
    {
        DiagramItem *di = qgraphicsitem_cast<DiagramItem*>(item);
        myScene.addItem(di);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接