QGraphicsItem возвращает неправильную позицию в сцене. (Qt4.7.3) - PullRequest
3 голосов
/ 25 января 2012

У меня есть элемент QGraphicsRectItem в QGraphicsScene. Элемент подвижный и имеет без родителя . Я помещаю позиции чтения позиции из файла и вызываю конструктор:

item = new QGraphicsRectItem (rect);

это работает. Позиции, как задумано.

Затем я пытаюсь сохранить позицию обратно в файл, получив ее из элемента, используя

item->pos().toPoint()

Позиция неправильная - не абсолютная позиция в сцене. Позиция относительно последней позиции, где был создан элемент.

Является ли pos () правильным методом для получения позиции элемента в сцене?

Спасибо за любые подсказки!

P.S .: scenePos () возвращает те же значения

Ответы [ 3 ]

5 голосов
/ 28 сентября 2012

У меня тоже были проблемы с QGraphicsRectItem. Моя текущая гипотеза такова:

«Прямоугольник», который вы устанавливаете / получаете, относится к «положению» элемента, поэтому вы можете использовать один или другой (или оба, если хотите запутаться), чтобы контролировать местоположение, в котором фактически рисуется геометрия .

Мое решение было таким:

// Given QRectF scene_rect that represents the rectangle I want drawn...
setPos( scene_rect.topLeft() ); // Set the item's "position" relative to the scene
scene_rect.moveTo( 0.0, 0.0 );  // ...then set the rectangle's location to (0,0)
setRect( scene_rect );          // ...so the rectangle is drawn at (0,0) relative to the item
3 голосов
/ 10 декабря 2012

Я нашел ваш вопрос, потому что искал в Интернете подсказки, какие из них использовать.

Я взглянул на источники в 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);

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

1 голос
/ 25 января 2012

Теперь я нашел обходной путь. Не завязывайте, если это ошибка Qt или мое недоразумение на сцене / представлении.

Теперь я создаю элементы в позиции 0,0 и перемещаю их в нужную позицию с помощью moveBy (x, y).

item = new QGraphicsRectItem( QRect(QPoint(x,y),QSize(w,h)) );
QPoint p = item->pos().toPoint(); //WRONG position! Relative to x,y

item = new QGraphicsRectItem( QRect(QPoint(0,0),QSize(w,h)) );
item->moveBy(x,y);
QPoint p = item->pos().toPoint(); //Right position! Relative to 0,0 of scene

Странно, как-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...