离开boundingRect后如何删除QGraphicsitem

时间:2014-04-10 02:31:01

标签: c++ qt coordinate-systems

我以为我可以使用下面的代码删除任何项目后离开场景,但事实并非如此。尝试不同的实现后,我想我应该尝试另一种方法。有些QGraphicsItem实际上是在boundingRect之外开始的,所以我想知道是否有一种方法可以在它们通过某个坐标点后删除和删除GraphicsItems。

void Scene::advance()
{
        QList <QGraphicsItem *> itemsToRemove;
        foreach( QGraphicsItem * item, this->items())
        {

            if( !this->sceneRect().intersects(item->boundingRect()))
            {
                // The item is no longer in the scene rect, get ready to delete it
                itemsToRemove.append(item);
            }                

        }

        foreach( QGraphicsItem * item, itemsToRemove )
        {
            this->removeItem(item);
            delete(item);
        }    

        QGraphicsScene::advance();
}

2 个答案:

答案 0 :(得分:1)

您可以保存每个项目的状态并跟踪状态更改。您可以在两个QVectors中拥有状态项目,例如:

QVector<QGraphicsItem *> items;
QVector<bool> itemIsInBoundingRect; // whether item is boundingrect or not

更新状态并跟踪状态变化:

void Scene::advance()
{
        for(int i=0;i<items.count();i++)
        {

            if(this->sceneRect().intersects(items[i]->boundingRect()))
            {
                // The item is in scene rect
                itemIsInBoundingRect[i] = true;
            }
            else // The item is in not in scene rect
            {
                if(itemIsInBoundingRect[i]) // track state change
                {
                     this->removeItem(items[i]);
                     delete(items[i]);
                     items.remove(i);
                     itemIsInBoundingRect.remove(i);
                }

            }                

        }

        QGraphicsScene::advance();
}

答案 1 :(得分:1)

问题出在这一行: -

 if( !this->sceneRect().intersects(item->boundingRect()))

这是将场景坐标中的场景矩形与项目的局部坐标系中项目的边界矩形进行比较。

您需要转换其中一个,以便在相同的坐标系中进行比较。

 QRectF itemSceneBoundingRect = item->mapRectToScene(item->boundingRect());
 if( !this->sceneRect().intersects(itemSceneBoundingRect)
 {
      // remove the item.
 }