根据Qt的文档,QPainter正在处理逻辑坐标。
但是QGraphicsScene的sceneRect和QGraphicsItem的boundingRect怎么样?
他们是在处理逻辑坐标还是物理坐标?
如果它在逻辑坐标上,是否有.partners {
display:block;
margin: 0 auto;
vertical-align:middle;
}
之类的函数?
答案 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()
。