QGraphicsItem在场景中返回错误的位置。 (Qt4.7.3)

时间:2012-01-25 11:39:58

标签: qt4

我在QGraphicsScene中有一个QGraphicsRectItem项。 该项目可移动并且没有父级。 我从文件中放置项目读取位置并调用构造函数:

item = new QGraphicsRectItem (rect);

有效。职位如预期。

然后我尝试通过使用

从项目中获取位置来将位置存回文件
item->pos().toPoint()

位置错误 - 不是场景中的绝对位置。该位置相对于创建项目的最后位置。

pos()是否正确检索场景中的项目位置?

感谢您的任何提示!

P.S .: scenePos()返回相同的值

3 个答案:

答案 0 :(得分:5)

我也遇到过QGraphicsRectItem的问题。我目前的假设是:

您设置/获取的“rect”是相对于项目的“pos”,因此您可以使用其中一个(或两者如果您想混淆)来控制实际绘制几何体的位置

我的解决方案是:

// Given QRectF scene_rect that represents the rectangle I want drawn...
setPos( scene_rect.topLeft() ); // Set the item's "position" relative to the scene
scene_rect.moveTo( 0.0, 0.0 );  // ...then set the rectangle's location to (0,0)
setRect( scene_rect );          // ...so the rectangle is drawn at (0,0) relative to the item

答案 1 :(得分:3)

我找到了你的问题,因为我在网上搜索了两种用途的提示。

我看了一下Qt 4.7.4来源:

  • QGraphicsRectItemPrivate有一个成员QRectF rect,您可以使用rect()获取并使用setRect()进行更改。
  • 但是,由于它来自QGraphicsItem,因此它还有QRectF pos
  • 函数boundingRect()返回由笔宽调整的rect,这意味着要更新的区域通常是正确的。

所以,正如aldo所说,你必须决定是否使用rect.topLeft或pos进行定位 为了帮助你和其他人决定,这里有一些赞成和反对点:

使用rect的优点:

  • 您可以在一个函数调用中定义QGraphicsRectItem的位置和大小。
  • QGraphicsLineItem的情况下,pos()函数始终指向boundingRect的topLeft角,它不必是其中一个线点,因此将pos留在QPointF(0,0) ),QLine点总是相对于场景。

使用rect的缺点:

  • 因为您无法使用setPos(),所以没有发出QGraphicsItem::ItemPositionChange的函数。对我来说,这一点比权重更重要,只要你没有使用QGraphicsLineItem(如果我需要一个QGraphicsLineItem,我可能从它派生并自己发送QGraphicsItem :: ItemPositionChange)。

如何以及何时使用两者:

如果同时使用pos和rect,请将pos作为GraphicsItem的中心 想象一下在图形场景中具有特定半径的标记,光标或类似物。如果您想使用QGraphicsRectItem,我建议:

QPointF markerpos = GetMarkerPos();
double r = GetMarkerRadius();
QRectF markerrect(-r, -r, +r * 2., +r * 2.); // topleft: -radius, size: 2*radius
setPos(markerpos);
setRect(markerrect);

这样,pos总是指向中心,而rect只由半径定义。

答案 2 :(得分:1)

现在我找到了解决方法。如果是Qt的错误或我对场景/视图的误解,请不要打结。

现在我在0,0位置创建项目,并使用moveBy(x,y)将它们移动到所需位置。

item = new QGraphicsRectItem( QRect(QPoint(x,y),QSize(w,h)) );
QPoint p = item->pos().toPoint(); //WRONG position! Relative to x,y

item = new QGraphicsRectItem( QRect(QPoint(0,0),QSize(w,h)) );
item->moveBy(x,y);
QPoint p = item->pos().toPoint(); //Right position! Relative to 0,0 of scene

很奇怪,不知何故。