- как 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
обновление метода вызывается только в двух случаях:
- если кто-то подключен к сигналу
changed
- если сцена не имеет просмотров
подробнее здесь
- Вы когда-нибудь должны вызывать update () самостоятельно после вызова
prepareGeometryChange () и затем изменить ограничивающий прямоугольник?
Я думаю, что ответ Нет . Помимо вызова update
, prepareGeometryChange
помечает как грязную область элемента на сцене, вызывая перекрашивание самой области. По моему опыту этого было достаточно в 100% случаев, поэтому мне не нужно было вызывать update ().