sceneRect和boundingRect在哪个坐标上工作?

时间:2015-08-06 12:18:05

标签: qt

根据Qt的文档,QPainter正在处理逻辑坐标。

但是QGraphicsScene的sceneRect和QGraphicsItem的boundingRect怎么样?

他们是在处理逻辑坐标还是物理坐标?

如果它在逻辑坐标上,是否有.partners { display:block; margin: 0 auto; vertical-align:middle; } 之类的函数?

2 个答案:

答案 0 :(得分:3)

GraphicsItem的boundingRect在本地坐标中定义其区域;该项目的本地。因此,从QGraphicsItem派生的项目(它覆盖其绘制函数)可以通过绘制其boundingRect来绘制项目区域: -

painter->drawRect(boundingRect());

QGraphicsItem的sceneRect是项目的boundingRect翻译成场景坐标。

因此,例如,来自这个骨架类:

class MyItem : public QGraphicsItem
{
    public: 
        QRectF boundingRect() const { return m_boundingRect; }

    private:
        QRectF m_boundingRect = QRectF(-10, -10, 20, 20);
}

定义边界矩形,使其中心位于(0,0)局部坐标中。

如果我们将它添加到场景中,在位置(0,0),调用项目的sceneBoundingRect函数将返回相同的坐标。

现在,如果我们在x中移动项目5个单位: -

pItem->setPos(5, 0);

boundingRect返回相同的本地坐标,但其sceneBoundingRect将返回其在场景中的位置; (-5,-10,20,20),这些是(x,y,宽度,高度)。

如果某个项目是另一个项目的子项,那么这将被考虑在内,因为设置其位置会将其设置为相对于其父项,或者在没有父项的情况下,将其设置为场景中的坐标。

因此,调用项目的boundingRect()函数将始终返回相同的坐标,无论项目位于场景中的哪个位置,但它的sceneBoundingRect将返回场景坐标;它驻留在场景中。

  

如果它在逻辑坐标上,是否有任何函数,如QPainter :: setWindow?

是的,QPainter有自己的转换系统,允许您在绘制之前执行旋转或缩放等操作。您可以在Qt documentation for QPainter

中详细了解其坐标转换

答案 1 :(得分:1)

sceneRect()boundingRect()在场景坐标(逻辑坐标)中工作。但是,如果您在场景中绘制QPainter也驻留在这些坐标中,它不知道物理坐标。

您可能希望使用setWorldTransform()代替setWindow()。虽然setWindow()可能仍然按预期工作,但它不支持浮点坐标,这是您从boundingRect()和朋友那里获得的。

要从QGraphicsScene返回物理坐标,您可以使用QGraphicsView::mapToGlobal()