Как да използвате локални координати за 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