无法将 QGraphicsView 坐标映射到 QGraphicsScene

Posted

技术标签:

【中文标题】无法将 QGraphicsView 坐标映射到 QGraphicsScene【英文标题】:Can not map QGraphicsView coordinate to QGraphicsScene 【发布时间】:2012-07-12 09:30:23 【问题描述】:

我有一个 QGraphicsView 包含一个加载图像的 QGraphicsScene。我的应用程序所做的是让用户注释此图像,以便我可以获得此图像的用户注释区域的坐标信息。为了更容易理解,我做了这张照片:

我想要的是基于图像坐标的确切坐标信息,因为我在场景中添加了像素图,我认为图像和场景具有相同的坐标系。但是,QGraphicsView 和场景坐标不同,如图所示,在我的电脑中它们的宽度和高度相差 5pix 和 1pix(总是这样吗?)。

我使用mapToScene函数,但我没有得到正确的坐标信息。

我在这里贴一些代码。

scene = new QGraphicsScene();
scene->addPixmap (pixmapItem);
ui->graphicsView->setScene (scene);


void MainWindow::mousePressEvent(QMouseEvent *event)

    if ((event->button() == Qt::LeftButton)&& beginAnnotation) 
        .......   

        QPointF mousePoint = ui->graphicsView->mapToScene(event->pos());
        qDebug() << mousePoint;
    

当我点击图片的左上角时,我希望我能得到 (0,0),但我却得到了 (5,1)。

请帮助我。

解决方案:

我认为@effjae 是对的。我的 mainWindow 捕获 mousrPressEvent。当我将图像加载到 View 包含的场景中时,我使用 ui-&gt;graphicsView-&gt;adjustSize(); ,所以,我认为 View 和 Scene 共享相同的坐标系,对吗?为此,我将图片更新为:

现在,我接受 effjae 的建议。我在 View 上安装了一个 eventFilter,现在 mouseClick 的坐标是基于 View & 场景的。谢谢。

【问题讨论】:

【参考方案1】:

我认为您在这里遇到的问题是您的 mousePressEvent 来自您的主窗口,而不是实际的 QGraphicsView。 mousePressEvent 为您的窗口提供坐标,包括任何边框或装饰。

要解决这个问题,您可以继承 QGraphicsView 并在其中处理 mousePressEvent,其方式与您在 MainWindowClass 中的方式完全相同。

一个快速但可能不太吸引人的解决方案是在 QGraphicsView 上安装一个事件过滤器。使用 QObject 的方法 installEventFilter 来做到这一点。

【讨论】:

如果我在View上安装eventFilter,View会先获取mouseEvent?那么,坐标信息会根据View吗?下一步是地图,我说的对吗? 嘿,我遇到了一个问题,我想你知道的。我在场景中添加了矩形,当我点击这个矩形区域时,我无法接收任何 mousePressEvent,为什么?

以上是关于无法将 QGraphicsView 坐标映射到 QGraphicsScene的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsView:如何高效获取QGraphicsItems的视口坐标?

无法将图像加载到 QGraphicsView(浮点除以零)。识别矩形,但不会设置场景

Qt 5.10 QGraphicsView 无法将 QGraphicsScene 缩放到全屏

在自定义 QGraphicsView 中移动 QGraphicsItem 问题

将 Autodesk forge 查看器 (ThreeJS) 坐标映射到原始 CAD 坐标

在 warpAffine 转换后如何将点重新映射或恢复到其以前的坐标系?