Должен ли QGraphicsItem :: boundingRect () включать дочерние ограничивающие ректы? - PullRequest
5 голосов
/ 16 сентября 2011

Googling предполагает, что оно должно .

Но пример реализации dragdroprobot (на родительском объекте Robot) предлагает не:

QRectF Robot::boundingRect() const
{
    return QRectF();
}

Что правильно, или происходит что-то более тонкое?

Ответы [ 3 ]

6 голосов
/ 16 сентября 2011

Дочерние элементы нарисованы непосредственно сценой, а не родителем, и согласно документации о boundingRect():

QGraphicsView использует это для определения необходимости перерисовки элемента.

Таким образом, если в родительском элементе нет рисования, нет необходимости возвращать ненулевой ограничивающий прямоугольник, даже если родительский элемент имеет дочерние элементы. И если в родительском элементе есть какой-то чертеж, он должен содержать только собственный ограничительный прямоугольник.

2 голосов
/ 17 сентября 2011

При обычном использовании дочерние элементы вашего QGraphicsItem содержатся в его ограничивающем прямоугольнике, но в зависимости от вашей реализации я не верю, что это требуется.

Если вам нужен ограничительный прямоугольник дочерних элементов, вы можете просто использовать

QGraphicsItem::childrenBoundingRect();
1 голос
/ 09 февраля 2013

Возможно связано:

  1. QGraphicItemGroup отличается.

Документация гласит:

Функция boundingRect () класса QGraphicsItemGroup возвращает ограничительный прямоугольник для всех элементов в группе элементов.

(Однако в документации не сказано, что boundingRect переопределён, хотя QGraphicsItemGroup наследует QGraphicsItem. Это, вероятно, недостаток в документации.)

  1. QGraphicItem.shape() похоже на boundingRect() в том смысле, что представление вызывает его для каждого экземпляра (для целей выбора, например, QGraphicsView.items(), аналогично boundingRect() для целей определения того, что необходимо перерисовать) .

Насколько я могу судить, QGraphicItemGroup.shape() никогда не вызывается QGraphicsView.items(). В документации не сказано, что она переопределена.

...