qt QGraphicsScene场景坐标和场景内GraphicsItem局部坐标的相互转换

为了更清晰地解释场景坐标与局部坐标之间的转换过程,我们可以通过一个简单的实例来演示如何赋值场景坐标,并将其转换为图形项的局部坐标。

实例步骤

假设我们有一个场景 QGraphicsScene 和一个矩形图形项 QGraphicsRectItem,矩形的大小为 100x100,位置在场景中的 (200, 200) 点。我们想将场景坐标 (250, 250) 转换为这个矩形图形项的局部坐标,此局部坐标再转回场景坐标。

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QPointF>
#include <QDebug>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);

    // 创建场景
    QGraphicsScene scene;

    // 创建一个矩形图形项,并设置其位置
    QGraphicsRectItem* rectItem = new QGraphicsRectItem(0, 0, 100, 100); // 矩形大小 100x100,左上角坐标 (0, 0)
    rectItem->setPos(200, 200); // 将矩形的位置设为场景中的 (200, 200)
    scene.addItem(rectItem);    // 将矩形添加到场景中

    // 创建视图并展示场景
    QGraphicsView view(&scene);
    view.show();

    // 定义一个场景坐标 (250, 250)
    QPointF scenePoint(250, 250);

    // 场景坐标 -> 矩形图形项的局部坐标
    QPointF localPoint = rectItem->mapFromScene(scenePoint);

    // 矩形图形项的局部坐标 -> 场景坐标
    QPointF newScenePoint = rectItem->mapToScene(localPoint);

    // 输出转换后的局部坐标
    qDebug() << "Scene Point:" << scenePoint;       // 输出: (250, 250)
    qDebug() << "Local Point in RectItem:" << localPoint; // 输出: (50, 50)
    qDebug() << "New scene point in scene:" << newScenePoint; // 输出: (250, 250)

    return a.exec();
}

补充

QPointF local_pt = mapFromParent(pt); 此方法可以从父项的坐标系转换到当前图形项(GraphicsRectItem)的本地坐标系中。

本资源为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); }
QtQGraphicsScene中,如果你想在绘制图形时添加网格线,并将左上角作为坐标原点,你可以按照以下步骤操作: 1. 首先,创建一个QGraphicsScene实例并将其添加到QGraphicsView控件中。 ```cpp QGraphicsScene *scene = new QGraphicsScene(this); QGraphicsView *view = new QGraphicsView(scene); ``` 2. 然后,在QGraphicsScene中设置网格线样式。你可以使用`QGraphicsScene::addRect`或`QGraphicsScene::drawGrid`函数,但后者更直接地设置了网格属性。 ```cpp // 设置网格线条的颜色间距 QPen pen(QColor("gray"), 0.5); // 线条颜色宽度 pen.setCosmetic(true); // 设置为虚线 // 使用drawGrid方法绘制网格,设定起点终点为场景的边界,origin是左上角坐标 scene->drawGrid(0, 0, scene->width(), scene->height(), pen, Qt::Horizontal | Qt::Vertical); ``` 这里,第一个参数是水平方向的网格间隔,第二个参数是垂直方向的网格间隔,第三个第四个参数是你想要网格跨越的宽度高度,第五个参数是用于绘制网格的笔对象,最后两个参数表示绘制水平垂直网格线。 3. 如果你想让左上角成为真正的坐标原点,那么在布局时保持默认即可,因为QGraphicsScene默认是以场景的中心为原点进行坐标计算的。如果你需要调整视口,可以通过`QGraphicsView::setSceneRect`来移动视口位置,使其以左上角为起始位置。 ```cpp // 移动视口到左上角 view->setSceneRect(0, 0, scene->width(), scene->height()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值