图形项的位置始终显示为0,0

时间:2014-12-08 11:52:53

标签: qt qgraphicsitem

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

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

2 个答案:

答案 0 :(得分:3)

QGraphicsScene::addEllipse州的文件: -

  

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

该功能定义为: -

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

传递给函数的rect提供了项目的本地坐标,项目位于(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

当检索项目的位置时,虽然函数QGraphicsItem :: pos将返回项目的父项坐标,如果没有父项,则可能是场景坐标,你最好不要调用{ {3}}保证返回的坐标实际上是场景坐标,即使您在稍后阶段添加父项也是如此。

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

答案 1 :(得分:2)

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

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

如果您添加ellipse,rect或其他内容,您应该知道:

  

请注意,项目的几何形状是在项目坐标及其中提供的   position被初始化为(0,0)。

在文档中有关于此的信息。因此,在使用setPos()

之后,您应该自己addSomeItem()

You can check also this good answer.

正如医生所说:

  

返回父坐标中项目的位置。如果该项目没有   父级,其位置以场景坐标给出。的立场   该项描述其父项中的原点(局部坐标(0,0))   坐标;此函数返回与mapToParent(0,0)相同的函数。对于   方便的话,你也可以调用scenePos()来确定项目   场景坐标中的位置,无论其父级如何。

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