【问题标题】:How to remove QGraphicsitems after leaving boundingRect离开boundingRect后如何删除QGraphicsitem
【发布时间】:2014-04-10 02:31:00
【问题描述】:

我认为我可以使用下面的代码在它离开场景后移除任何项目,但事实并非如此。在尝试了不同的实现之后,我想我应该尝试另一种方法。一些 QGraphicsItems 实际上是在 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();
}

【问题讨论】:

    标签: c++ qt coordinate-systems


    【解决方案1】:

    问题出在这一行:-

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

    这是在场景坐标中的场景矩形与项目的边界矩形(在项目的本地坐标系中)的比较。

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

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

    【讨论】:

      【解决方案2】:

      您可以保存每个项目的状态并跟踪状态变化。您可以在两个 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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 1970-01-01
        • 2016-04-09
        • 1970-01-01
        • 2021-09-26
        相关资源
        最近更新 更多