【问题标题】:Qt QGraphicsScene copyQt QGraphicsScene 拷贝
【发布时间】:2010-09-21 01:06:38
【问题描述】:

我有一个 QGraphicsScene 我想复制并附加到列表的开头。这样做的最佳方法是什么?

QGraphicsScene* m_scene = new QGraphicsScene();
QGraphicsScene* m_DuplicateScene;

QList<QGraphicsScene *>m_list;

【问题讨论】:

  • 追加到列表,还是插入到列表的开头(有时称为前置)?另外,你是要复制指针,还是复制整个场景?
  • 我想复制整个场景,并将其附加到列表中。

标签: c++ qt


【解决方案1】:

我在我的项目中复制了 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);
    }
}

【讨论】:

    【解决方案2】:

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

    基本上,不,您不能复制QGraphicsScene(克隆过程中的所有项目)。您甚至不能引用原始场景子节点的子节点,因为 QGraphicsItem 只能有一个场景。

    当然,除非我错过了方法调用。但是,搜索“克隆”、“复制”和“重复”没有结果。

    关于第二个问题,请使用QList&lt;T *&gt;::push_front。因此,m_list.push_front(m_DuplicateScene);

    (旁注:您添加到列表的开头,并添加到列表的末尾。)

    【讨论】:

    • 谢谢,我最终创建了一个序列化 Scenes 属性的方法,然后遍历 Scenes 对象并让它们自己序列化。它很慢而且工作量很大,但它确实有效。
    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2015-01-13
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2012-04-13
    相关资源
    最近更新 更多