Qt Graphics View坐标系统
Graphics View基于笛卡尔坐标系。item在场景中的位置与几何形状通过x,y坐标表示。在Graphics View中有三个有效的坐标系统:视图坐标系,场景坐标系,Item坐标系。
视图坐标系
视图坐标是widget的坐标,它是相对于widget或是view的,它的视口的左上角总是(0,0),右下角总是(width,height)。
在上一篇中,我们对QGraphicsView的坐标设置就是设置视图坐标系。
QGraphicsView view(&scene);
view.setGeometry(200,200,400,400);//视图坐标系
场景坐标系
场景坐标系包含了各个顶级item的位置,通过QGraphicsItem::scenePos(),QGraphicsItem::sceneBoundingRect()来确定每一个item的位置。
QGraphicsScene scene;
scene.setSceneRect(-300,-300,600,600);//场景坐标系
item在场景坐标系中的位置
item->setPos(0,0);
Item坐标系
每个item在场景坐标系中设好pos后,它们就以pos为原点,拥有自己的坐标系,比如boundingRect确定的重绘范围和shape确定的形状就是以item的坐标系来确定的。每个item的变换都是以自身的pos为原点。
QRectF boundingRect()const
{
return m_rect;
}
QPainterPath shape()const
{
QPainterPath path;
path.addRect(m_rect);
return path;
}
坐标转换
Graphics View提供了方便的函数,允许三个坐标系之间相互映射。
例如:
qDebug() << view.mapToScene(0,0,200,200);
输出
QPolygonF(QPointF(-190, -199) QPointF(10, -199) QPointF(10, 1) QPointF(-190, 1) )
此外view和item都拥有以mapto和mapfrom开头的一系列坐标变换函数。
变换
上一章中讲了一些简单的变形,事实上我们可以在Qt Graphics View中使用我们的线性代数知识来应用一些变换。
例如对单独的item设置变换
item->setMatrix(QMatrix(2,1,
0,1,
0,0));//最后一排的作用参考平移矩阵
对view设置变换
view.setMatrix(QMatrix(1,1,
0,1,
0,0));