Как работает QGraphicsItem :: prepareGeometryChange ()? - PullRequest
11 голосов
/ 23 марта 2012

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

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

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

1 Ответ

17 голосов
/ 23 марта 2012
  • как 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. если сцена не имеет просмотров

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

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

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

...