如何映射项目坐标?

How to map item coordinates?

我知道每个项目都有自己相对于场景的坐标。我在场景中添加了一个椭圆。他们每个人 returns 以下来自 boundingRect(): QRect(0, 0, 50, 50)。我不知道如何将坐标映射到另一个 QGraphicsItem 这是一条线。这条线应该连接这两个椭圆。我有正确的椭圆坐标,我将它们传递给自定义 QGraphicsLineItem 构造函数。但是,该行位于错误的位置。我应该如何使用mapFromItem()或其他方法得到结果?

我得到每个椭圆的坐标如下:

selfCoords = ellipse->mapFromScene(QPointF(0.0,0.0));

您应该将每个椭圆的坐标映射到某个公共坐标系,然后您可以将其映射到直线的父坐标系。公共坐标系可以是场景的坐标系。

例如,要连接椭圆的中心:

QGraphicsScene scene;
QGraphicsEllipseItem e1, e2;
scene.addItem(&e1);
scene.addItem(&e2);
... // set the ellipse rects/sizes
auto start = e1.mapToScene(e1.boundingRect().center());
auto end = e2.mapToScene(e2.boundingRect().center());
QGraphicsLineItem l(QLineF(start, end));
scene.addItem(&l);

您可以这样做,因为线条的父级是场景。现在假设这条线有其他父级 - 您需要将坐标映射到该父级。

...
QGraphicsItem p;
p(20, 20);
scene.addItem(&p);
auto start = e1.mapToItem(&p, e1.boundingRect().center());
auto end = e2.mapToItem(&p, e2.boundingRect().center());
QGraphicsLineItem l(QLineF(start, end), &p);

如果我想在鼠标位置添加新的椭圆,如何将坐标映射到椭圆项目以在场景中获得正确的位置?例如从 contextMenuEvent 我得到 QPointF coords = event->scenePos(); 然后我想创建椭圆。我有自定义 QGraphicsScene MyScene,其中有指向 QGraphicsView* view.

的指针

我使用事件形式void MyScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)

QPointF coords = event->scenePos(); QPointF ellpiseCoords = view->mapToScene(coords .x(), coords .y())

我总是做错变换。