我正在开发一个Qt项目,用户通过鼠标点击来绘制点数。我正在尝试使用以下代码打印点的位置。 程序始终将位置打印为QPointF(0,0)。
QList<QGraphicsItem *> list = scene->items();
foreach( QGraphicsItem * item, list )
{
qDebug()<<item->pos();
}
答案 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()来确定项目 场景坐标中的位置,无论其父级如何。