Как работает QGraphicsItem :: prepareGeometryChange ()?

Согласно документации Qt, он «Подготавливает элемент к изменению геометрии. Вызовите эту функцию перед изменением ограничивающего прямоугольника элемента, чтобы поддерживать индекс QGraphicsScene в актуальном состоянии. PrepareGeometryChange () вызовет update (), если это необходимо».

Я не понимаю, как QGraphicsItem знает, когда изменяется ограничивающий прямоугольник, и как он знает, когда вызывать update (). Вы когда-нибудь должны были вызывать update () самостоятельно после вызова prepareGeometryChange () и последующего изменения ограничивающего прямоугольника?

Я был бы очень признателен за понимание того, что кажется методом ясновидения.


person Anthony    schedule 23.03.2012    source источник


Ответы (1)


  • как 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 update вызывается только в двух случаях:

  1. если кто-то подключен к сигналу changed
  2. если сцена не имеет просмотров

подробнее здесь

  • Вы когда-нибудь должны были вызывать update () самостоятельно после вызова prepareGeometryChange () и последующего изменения ограничивающего прямоугольника?

Думаю, ответ - Нет. Помимо вызова update, prepareGeometryChange отмечает как загрязненную область элемента на сцене, вызывая перерисовку самой области. По моему опыту, этого было достаточно в 100% случаев, поэтому мне не нужно было вызывать update ().

person Masci    schedule 23.03.2012
comment
в более общем плане можно уточнить, что он должен вызываться всякий раз, когда изменяется ввод вычисления ::boundingRect(). Но ваш пример верен. - person azf; 23.03.2012
comment
Еще раз спасибо и извините за задержку! - person Anthony; 02.04.2012