QT Graphics View坐标系转换

背景

在做绘图处理时,Scence作为场景,大小是无限的,而View作为一个观察镜头,观察范围是有限的。
那么有限的View观察无限的Scence区域,必然要选定一个观测锚点。
所以View具有一个centerOn(QPointF pos)函数,输入的是Scence的坐标,把SCence中位于pos的点显示在View的中心。即以Scence的pos点作为View观察的中心。

中心点坐标分析

默认情况下,View是选择ScenceRect的中心点作为观察中心的。
Scence是无限大的,但是我们作画一般是在Scence的某一区域进行的,所以可以对Scence设置一个ScenceRect,如果不设置,那么系统会计算你画的所有Item的边界并集当做ScenceRect,这样效率不高。
一般情况下,会手动给Scence设置一个ScenceRect。设置好之后,View的中心点就是这个ScenceRect的中心点。
具三个例子来说明如下:

ScenceRect比View小

view的大小为:1200*687
senceRect大小为(0,0,200,200)

	QRect rect(0,0,200,200);
    m_scence->setSceneRect(rect);
    m_scence->addRect(rect);
    m_scence->addRect(QRectF(0,0,100,100));
	m_scence->addRect(QRectF(100,100,50,50));
    m_scence->addItem(rectItem1);
    ui->graphicsView->setScene(m_scence);

效果如下,View以SenceRect的中点(100,100)为中心点:
在这里插入图片描述

ScenceRect与View相等

当ScenceRect与View相等时,那么SCenceRect的中点必然就是View的中点,此时两个坐标系的远点是重合的:
在这里插入图片描述

ScenceRect比View大

道理同上,不再赘述。

遗留问题

资料上说,Item的原点是item的中心点,但是上面的实验中的item的原点默认都是左上角。

在Item中,setPos(pos)是指把item的位置设置到pos处,pos是scence坐标,设置好之后,item的原点(0,0)就是scence的pos。

1. 不使用setpos时

 	RectGraphicsItem *rectItem = new RectGraphicsItem(QRectF(20,20,150,50));
    rectItem->setColor(QColor(Qt::black));
    m_scence->addItem(rectItem);

指定了初始化的位置为(20,20)的矩形,此时item的默认原点坐标与Scence的原点坐标重合,所以如下所示:
在这里插入图片描述

2. 使用setpos时

	RectGraphicsItem *rectItem = new RectGraphicsItem(QRectF(20,20,150,50));
    rectItem->setColor(QColor(Qt::black));
    rectItem->setPos(20,20);
    m_scence->addItem(rectItem);

如上所示,设置了(20,20)的矩形后,会在Scence(20,20)的位置画一个矩形,setPos(20,20)后,会把item放到sence(40,40)的位置,此时item的原点坐标(0,0)不再与Scence重合,而是在Secence的(20,20)位置。
在这里插入图片描述

3. 推荐方式
如上面1和2介绍,item的内部坐标还要与父坐标系进行转换,较为复杂,在写代码绘制时,脑子要转好几个弯,造成思维混乱,为了解决这个问题,见如下代码:

//位置都从(0,0)开始
RectGraphicsItem *rectItem = new RectGraphicsItem(QRectF(0,0,150,50));
rectItem->setColor(QColor(Qt::black));
rectItem->setPos(20,20);//然后平移到sence的(20,20)位置,此时item的(0,0)就是此点
m_scence->addItem(rectItem);
  • 初始化rect时,总是设置为(0,0)。
  • 使用setpos设置到相应的位置(x,y),如上面的(20,20)。
  • 这样,item的原点就是(x,y),对item内部来说总是以左上角(0,0)为坐标的原点,item的坐标不至于混乱。结果与1中的对比如下:
    在这里插入图片描述
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源为Qt绘图基础,世界坐标系转换为逻辑坐标系。世界坐标系原点在视图左上角,本例子通过世界坐标转换,将坐标原点定位在视图中央,Y轴向上,X轴向右,并绘制坐标轴,基于逻辑坐标系下的绘图,可将转换关系函数取消生效,对比世界坐标系下的绘图。 重写PainterEvent函数: void QtPixPainter::paintEvent(QPaintEvent* event) { QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); //物理坐标系与逻辑坐标系转换,如果不转换,下面的绘图都是在世界坐标系下 setWorldTransform(painter); // 其他一些绘制矩形,多边形的例子,经过上面转换,都是在逻辑坐标系下 drawRectScale(painter); //draw_shearRect(painter); //利用rotate()函数进行比例变换,实现缩放效果 //draw_rotate_act(painter); //draw_by_save_restore(painter); //transform_draw_SinX(painter); transform_draw(painter); local_drawConvexPolygon(painter); } // 将世界坐标(原点左上角)转换为逻辑坐标(原点在屏幕中间) QPointF QtPixPainter::mapToScene(const QPointF& point) { QTransform transMatrix = _transform.inverted(); //翻转矩阵? return transMatrix.map(point); //将点piont映射到transMatrix定义的坐标系中来 } // 将鼠标的逻辑位置返回并以标签形式展示 void QtPixPainter::mouseMoveEvent(QMouseEvent* event) { QString msg; QPointF mouse_po = mapToScene(event->pos()); //总是返回屏幕物理坐标系 double x = mouse_po.x(); // 总是返回屏幕物理坐标系 double y = mouse_po.y(); QString str = "(" + QString::number(x) + "," + QString::number(y) + ")"; //qDebug()<<"world x = "<pos().x()<<",world y = "<pos().y(); m_mouse_lable->setText(str); }
QtGraphics View 框架中,图像的坐标通常使用 QGraphicsScene 和 QGraphicsItem 来表示。QGraphicsScene 是一个可以被视为一个二维平面的容器,而 QGraphicsItem 则是这个平面上的一个元素,可以是一个矩形、椭圆、多边形等等。 在 QGraphicsItem 中,图像的位置可以通过设置其坐标(x 和 y 坐标)来实现。在 QGraphicsScene 中,可以使用 QGraphicsScene::addItem() 方法将 QGraphicsItem 添加到场景中,并且可以通过 QGraphicsScene::setSceneRect() 方法来设置场景的大小和位置。 当图像在 QGraphicsView 中显示时,它们的坐标将被转换为视口坐标系。视口坐标系是 QGraphicsView 中用于显示图像的坐标系,其原点为视口的左上角,x 轴向右延伸,y 轴向下延伸。可以使用 QGraphicsView::mapToScene() 和 QGraphicsView::mapFromScene() 方法将视口坐标系与场景坐标系相互转换。 例如,以下代码片段将一张图片加载到 QGraphicsScene 中,并将其在 QGraphicsView 中居中显示: ```cpp QImage image("example.png"); QGraphicsScene* scene = new QGraphicsScene(); QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image)); scene->addItem(item); scene->setSceneRect(QRectF(image.rect())); QGraphicsView* view = new QGraphicsView(scene); view->setAlignment(Qt::AlignCenter); view->show(); ``` 在这个例子中,图像的位置使用 QGraphicsPixmapItem 的坐标属性进行设置,而场景的大小则使用图像的大小进行设置。最后,将 QGraphicsView 的对齐方式设置为居中,并且显示视图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值