qt QGraphicsScene additem

时间:2014-07-18 10:13:23

标签: c++ qt qgraphicsscene

http://qt-project.org/doc/qt-4.8/qgraphicsscene.html#addItem

所述

  

如果项目已经在另一个场景中,它将首先从旧场景中删除,然后作为一个场景添加到此场景中   顶层

我想将项目保留在旧场景中。 我怎么能这样做?

myscene1.addItem(item);
myscene2.addItem(item);// I don't want to remove item from myscene1

3 个答案:

答案 0 :(得分:0)

一个项目不能同时占用两个场景,就像你不能同时在两个地方一样。

执行此操作的唯一方法是制作项目的副本并将其放在第二个场景中。

答案 1 :(得分:0)

您可以复制该项目:

myscene1.addItem(item);
myscene2.addItem(item->clone());

答案 2 :(得分:0)

你可以做的是创建一个新类。例如

class Position
{
   ...
   QPoinfF pos;
   ...
}

然后您可以将该类添加到您的项目中。

class Item : public QGraphicsItem
{
   ...
public:
   void setSharedPos(Position *pos)
   {
      sharedPosition = pos;
   }

   //implement the paint(...) function
   //its beeing called by the scene
   void paint(...)
   {
      //set the shared position here
      setPos(sharedPos);
      //paint the item
      ...
   }
protected:
   void QGraphicsItem::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )
   {
      //get the position from the item that could have been moved
      //you could also check if the position actually changed
      sharedPosition->pos = pos();
   }

private
   Position *sharedPostion;
   ...
}

您不必创建两个项目,并为它们提供指向Position对象的相同指针。

Item *item1 = new Item;
Item *item2 = new Item;
Position *sharedPos = new Position;

item1->setSharedPos(sharedPos);
item2->setSharedPos(sharedPos);

myScene1->addItem(item1);
myScene2->addItem(item2);

他们不应该至少在场景中分享他们的立场。 如果这样做,那么您必须更改Position类以满足您的需求,它应该正常工作。

如果在paint()函数中设置位置有效,我就不太舒服了。但那就是我将如何尝试同步项目。如果它不起作用,那么您将不得不寻找另一个地方来更新项目的设置。

或者您可以将项目指向彼此,并让他们直接更改位置/设置。

e.g。

class Item : public QGraphicsItem
{
...
   void QGraphicsItem::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )
   {
       otherItem->setPos(pos());
   }
...
   void setOtherItem(Item *item)
   {
      otherItem = item;
   }
private:
   Item *otherItem;
}

Item *item1 = new Item;
Item *item2 = new Item;

item1->setOtherItem(item2);
item2->setOtherItem(item1);

myScene1->addItem(item1);
myScene2->addItem(item2);