Я нашел ваш вопрос, потому что искал в Интернете подсказки, какие из них использовать.
Я взглянул на источники в Qt 4.7.4:
QGraphicsRectItemPrivate
имеет член QRectF rect
, который можно получить с помощью rect () и изменить с помощью setRect (). - Но, поскольку он является производным от
QGraphicsItem
, он также имеет QRectF pos
. - Функция
boundingRect()
возвращает rect
, скорректированную по ширине пера, что означает, что обновляемая область, как правило, является правильной.
Итак, как сказал Альдо, вы должны решить,используйте для позиционирования rect.topLeft или pos.
Чтобы помочь вам и другим решить, вот несколько плюсов и минусов:
Преимущества использования прямоугольника:
- Вы можете определить положение и размер QGraphicsRectItem в одном вызове функции.
- В случае
QGraphicsLineItem
, функция pos () всегда указывает на угол topLeft объекта boundingRect, который не 't должна быть одной из точек линии, поэтому, оставляя pos в QPointF (0,0), точки QLine всегда равныв отношении сцены.
Недостаток использования прямоугольника:
- Поскольку вы не можете использовать setPos (), нет функции, которая генерирует
QGraphicsItem::ItemPositionChange
.Для меня эта точка весит больше, чем преимущества, если вы не используете QGraphicsLineItem (Если мне понадобится QGraphicsLineItem, я, вероятно, извлеку из него и отправлю QGraphicsItem :: ItemPositionChange сам).
Как и когда использовать оба:
Если вы используете и pos, и прямоугольник, пусть pos будет центром вашего GraphicsItem.
Представьте маркер и курсорили подобное с определенным радиусом в вашей графической сцене.Если вы хотите использовать QGraphicsRectItem
для этого, я предлагаю:
QPointF markerpos = GetMarkerPos();
double r = GetMarkerRadius();
QRectF markerrect(-r, -r, +r * 2., +r * 2.); // topleft: -radius, size: 2*radius
setPos(markerpos);
setRect(markerrect);
Таким образом, позиция всегда указывает на центр, а прямоугольник определяется только радиусом.