【问题标题】:The position of graphic item is always displayed as 0,0图形项的位置始终显示为 0,0
【发布时间】:2014-12-08 21:19:51
【问题描述】:

我正在开发一个 Qt 项目,用户通过鼠标点击来绘制点。我正在尝试使用以下代码打印点的位置。 程序总是将位置打印为 QPointF(0, 0)。

QList<QGraphicsItem *> list = scene->items();
foreach( QGraphicsItem * item, list )
{
  qDebug()<<item->pos();
}

【问题讨论】:

    标签: qt qgraphicsitem


    【解决方案1】:

    QGraphicsScene::addEllipse 的文档指出:-

    创建一个椭圆项目并将其添加到场景中,并返回项目指针。椭圆的几何由rect定义,其笔刷初始化为笔刷。 请注意,项目的几何图形以项目坐标提供,其位置初始化为 (0, 0)。

    函数定义为:-

    QGraphicsEllipseItem * QGraphicsScene::addEllipse ( const QRectF & rect, const QPen & pen = QPen(), const QBrush & brush = QBrush() )
    

    传递给函数的矩形提供了项目的本地坐标,项目位于 (0,0)。

    您需要使用 addEllipse 返回的指针并调用 setPos() 来设置项目的位置

    QGraphicsEllipseItem* pEllipse = scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0,QPen(), QBrush(Qt::SolidPattern));
    
    pEllipse->setPos(xPos, yPos); // where xPos and yPos are the scene coordinates
    

    在获取item的位置时,虽然函数QGraphicsItem::pos会返回item的父坐标,如果没有父坐标可能是场景坐标,你最好调用QGraphicsScene::scenePos来保证返回的坐标是真实的场景坐标,即使您稍后添加父项。

    QList<QGraphicsItem *> list = scene->items();
    foreach( QGraphicsItem * item, list )
    {
      qDebug() << item->scenePos();
    }
    

    【讨论】:

    • 也许我误解了一些东西,但我写了同样的东西,不是吗?与 OP 通信时,我在 cmets 中发布的代码相同。
    • @Chernobyl,我相信您试图传达相同的信息(+1),但是如果您认为已经存在的答案不完整或缺乏,那么在 SO 中提供类似的答案是可以接受的明晰。我假设 OP 在这里同意,这就是为什么这被标记为问题的正确答案。
    • @Merlin069 我只是认为我的回答有误,您发布了正确的解决方案,但我不知道我的错误在哪里。但现在我明白了,所以也为你 +1。
    • @切尔诺贝利,不用担心。如果我发现了一个错误,我会提到它,而不是回答。
    【解决方案2】:

    您还应该setPos() 到项目,在这种情况下,这些方法将为您提供正确的输出。我想现在你的代码是这样的:

    scene->addEllipse(x, y, w,h);
    

    如果您添加椭圆、矩形或其他内容,您应该知道:

    请注意,项目的几何图形是在项目坐标中提供的,并且它的 位置被初始化为 (0, 0)。

    文档中有关于此的信息。所以你应该在使用addSomeItem()后自己setPos()

    You can check also this good answer.

    正如医生所说:

    返回项目在父坐标中的位置。如果该项目没有 父级,它的位置在场景坐标中给出。的位置 该项目在父项中描述其原点(局部坐标 (0, 0)) 坐标;此函数返回与 mapToParent(0, 0) 相同的值。为了 方便,您也可以调用 scenePos() 来确定项目的 场景坐标中的位置,与父级无关。

    http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#pos

    【讨论】:

    • 我尝试使用它,但我仍然遇到同样的问题。
    • 我已经使用这个设置了位置:scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0,QPen() , QBrush(Qt::SolidPattern));
    • @shahdewai 更仔细地阅读了我的答案,并链接到另一个阅读的答案。 Pos 是 0,0 ,你的输出是正确的,你需要 setPos QGraphicsItem * it = scene-&gt;addEllipse(0, 0, rad*2.0, rad*2.0,QPen(), QBrush(Qt::SolidPattern)); it-&gt;setPos(pt.x()-rad,pt.y()-rad);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多