无法将 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->graphicsView->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 问题