我们从小学习的数学中是右手坐标系,很多系统中(如:ros)也是右手系,而Qt Graphics View Framework 中却是左手坐标系,当两个不同坐标系的系统结合时,导致了界面上显示的内容和其他系统中的内容是上下翻转的,虽然看起来别扭,但是各种操作却不会有任何问题。
解决办法 方案一在QGrahpicsView中将整个显示上下翻转,也就是坐标系还是原来的坐标系,但是显示上是上下翻转的,这样就很迅速的解决了问题。
GraphicsView::GraphicsView(QWidget *parent) : QGraphicsView(parent){ ... // NOTE:解决左手坐标系和右手坐标系的问题,Qt是左手坐标系,算法是右手坐标系,所以此处要将坐标系的Y轴翻转 QTransform transform; transform.setMatrix(1, 0, 0, 0, -1, 0, 0, 0, 1); setTransform(transform);}当然这种解决方案也带来些小问题:
比如说:要将QRect的四个点的坐标按照顺时针方向发给算法模块在坐标系没有变换前,四个点发送的顺序是:rect.topLeft() => rect.topRight() => rect.bottomRight() => rect.bottomLeft()。但在坐标系变换后,四个点发送顺序成了:rect.bottomLeft() => rect.bottomRight() => rect.topRight() => rect.topLeft()。
当然,你画的字体也是颠倒的,需要手动将其翻转。
在Qt和算法接口模块中实现两个函数,QPointF mapToScene(const QPointF &point)和QPointF mapFromScene(const QPointF &point),凡是进入Qt的坐标都调用一次mapToScene(),凡是从Qt出去的坐标调用一次mapFromScene(),这样能完美解决问题,但是会有些复杂。