首页 > 编程知识 正文

Qt Graphics View Framework中左手系转右手系,左手校花右手系花

时间:2023-05-03 23:26:43 阅读:222152 作者:84

问题来源

我们从小学习的数学中是右手坐标系,很多系统中(如: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()。
当然,你画的字体也是颠倒的,需要手动将其翻转。

void GraphicsRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ QGraphicsRectItem::paint(painter, option, widget); // 将文本翻转 QTransform transform; transform.setMatrix(1, 0, 0, 0, -1, 0, 0, rect().center().y() * 2, 1); painter->setTransform(transform, true); painter->drawText(rect(), Qt::AlignCenter, QObject::tr("静态区域"));} 方案二

在Qt和算法接口模块中实现两个函数,QPointF mapToScene(const QPointF &point)和QPointF mapFromScene(const QPointF &point),凡是进入Qt的坐标都调用一次mapToScene(),凡是从Qt出去的坐标调用一次mapFromScene(),这样能完美解决问题,但是会有些复杂。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。