Как использовать локальные координаты в QGraphicsItem

Я создал собственный qGraphicsRectItem, который добавил в свой qGraphicsScene. Я хотел бы добавить текст в этот настраиваемый прямоугольник, используя его локальные координаты (т.е. добавление 0,0 помещает элемент в начало моего прямоугольника независимо от того, где он находится в моей сцене). Когда я пытаюсь это сделать, он использует мою сцену система координат, и текст появится вне прямоугольника. Любые идеи?

  PackageRect::PackageRect(QString PackageName, qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent)
    :QGraphicsRectItem(x, y, w,  h, parent)
{

    QGraphicsTextItem *text = new QGraphicsTextItem(PackageName, this);
    text->setPos(0,0);
}

person user1337    schedule 06.02.2015    source источник


Ответы (2)


То, что вы пытаетесь сделать, обычно используется в «сгруппированных» элементах.

Есть несколько mapTo* функций, в том числе:

http://doc.qt.io/qt-5/qgraphicsitem.html

QPointF mapToItem(const QGraphicsItem * item, const QPointF & point) const
QPointF mapFromItem(const QGraphicsItem * item, const QPointF & point) const
QPointF mapFromScene(const QPointF & point) const
QPointF mapToScene(const QPointF & point) const

В основном контекст, из которого вы вызываете функцию сопоставления, изменяет поведение вызова сопоставления.

Если вы находитесь внутри подкласса QGraphicsItem и вызываете this->mapToItem(myRect, QPointF(0,0));, он вернет значение в терминах системы координат прямоугольника.

Точно так же, если вы находитесь внутри подкласса QGraphicsItem и вызываете this->mapFromItem(myRect, QPointF(0,0));, он вернет значение в терминах системы координат исходного элемента, где 0,0 - это верхний левый угол прямоугольника.

Дополнительная документация по системе координат:

http://doc.qt.io/qt-5/graphicsview.html#the-graphics-view-coordinate-system.

Но если вы группируете объекты в QGraphicsView, сгруппируйте их и перемещайте группу.

http://doc.qt.io/qt-5/graphicsview.html#item-groups

http://doc.qt.io/qt-5/qgraphicsitemgroup.html#details

Надеюсь, это поможет.

person phyatt    schedule 08.02.2015

Для setPos делаем 0,0, но x, y. для меня с:

rectText::rectText(QString PackageName, qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent)
    :QGraphicsRectItem(x, y, w,  h, parent)
{
    QGraphicsTextItem *text = new QGraphicsTextItem(PackageName, this);
    text->setPos(x, y);
}

Текст в рамке.

person Gabriel de Grimouard    schedule 06.02.2015
comment
с координатами x и y не имеет значения, где находится прямоугольник в сцене, он находится в начале прямоугольника. - person Gabriel de Grimouard; 07.02.2015
comment
Действительно, он использует систему координат сцены, а не локальную систему Предмета. - person user1337; 08.02.2015