【问题标题】:How to map item coordinates?如何映射项目坐标?
【发布时间】:2015-08-28 06:40:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ qt qgraphicsitem


    【解决方案1】:

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

    例如,连接椭圆的中心:

    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);
    

    【讨论】:

      【解决方案2】:

      如果我想在鼠标位置添加新的椭圆,如何将坐标映射到椭圆项目以在场景中获得正确的位置?例如从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())

      我总是得到错误的变换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多