根据 Qt 文档,它“为几何更改准备项目。在更改项目的边界矩形之前调用此函数以使 QGraphicsScene 的索引保持最新。如果有必要,prepareGeometryChange() 将调用 update()。”
我不明白的是 QGraphicsItem 如何知道边界矩形何时更改,以及它如何知道何时调用 update()。您是否应该在调用 prepareGeometryChange() 然后更改边界矩形后自己调用 update() ?
我非常感谢对似乎是千里眼的方法的一些见解。
根据 Qt 文档,它“为几何更改准备项目。在更改项目的边界矩形之前调用此函数以使 QGraphicsScene 的索引保持最新。如果有必要,prepareGeometryChange() 将调用 update()。”
我不明白的是 QGraphicsItem 如何知道边界矩形何时更改,以及它如何知道何时调用 update()。您是否应该在调用 prepareGeometryChange() 然后更改边界矩形后自己调用 update() ?
我非常感谢对似乎是千里眼的方法的一些见解。
我想你知道。假设您有一个 QGraphicsItemGroup 聚合了多个子项,并且您希望一次只显示一个子项。group item的bounding rect需要和当前选中item的bounding rect一致:
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 的边界矩形,并且项目的更新(在其他地方触发)将涉及错误的矩形。
根据 QGraphicsItem 来源,prepareGeometry
方法更新仅在两种情况下被调用:
changed
信号更多细节在这里
我认为答案是否定的。除了对 的调用之外,update
将prepareGeometryChange
场景中的项目区域标记为脏,从而导致重新绘制该区域本身。根据我的经验,这在 100% 的情况下就足够了,所以我不需要调用 update()。