QGraphicsItem :: prepareGeometryChange()如何工作?

时间:2012-03-23 03:01:59

标签: qt qgraphicsitem

根据Qt文档,它“为几何变化准备项目。在更改项目的边界矩形之前调用此函数以使QGraphicsScene的索引保持最新。如果需要,prepareGeometryChange()将调用update() 。“

我不明白的是QGraphicsItem如何知道边界矩形何时发生变化,以及它如何知道何时调用update()。您是否应该在调用prepareGeometryChange()然后更改边界矩形后自己调用update()?

我非常感谢对洞察力似乎是透视的方法有所了解。

1 个答案:

答案 0 :(得分:17)

  • QGraphicsItem如何知道边界矩形何时发生变化?

我认为你知道。假设您有一个QGraphicsItemGroup聚合了几个子项,并且您希望一次只显示一个子项。组项的边界矩形需要与当前所选项的边界矩相同:

QRectF MyItemGroup::boundingRect() const
{
    QRectF rect;
    if (currentItem_) {
        rect = currentItem_->boundingRect();
    }
    return rect;
}

假设您有一种方法可以更改必须显示哪一个孩子:

void MyItemGroup::setCurrentItem(MyItem * item)
{
    if (list_of_items_.contains(item)) {
        prepareGeometryChange();
        currentItem_ = item;
    }
}

如果你注释掉prepareGeometryChange,视图将不会再次询问MyItemGroup的边界矩形,并且项目的更新(在其他地方触发)将涉及错误的矩形。

  • 如何知道何时调用update()?

根据QGraphicsItem来源,仅在两种情况下调用prepareGeometry方法更新内部:

  1. 如果有人连接到changed信号
  2. 如果场景没有视图
  3. 更多详情here

    • 您是否应该在致电后自行致电update() prepareGeometryChange()然后更改边界矩形?

    我认为答案是。除了调用update之外,prepareGeometryChange标记为场景中的项目区域脏,导致区域本身的重绘。根据我的经验,这足以满足100%的情况,所以我不需要调用update()。