Qt QGraphicView和QGraphicScene鼠标位置

时间:2017-03-01 19:02:37

标签: c++ qt graph qgraphicsview qgraphicsscene

我有显示ELF二进制文件内部结构的项目。我使用QGraphicsView和QGraphicsScene。所以我可以在图形场景上显示块,但我需要在鼠标点击单块显示该块的内容后。我正在尝试使用功能:

void MainWindow::mousePressEvent(QMouseEvent* event)
{
   ui->textEdit->append(QString("x = %1, y = %2").arg(event->Pos().x()).arg(event->Pos().y()));
}

但是位置在整个窗口中跟踪。问题是,窗口的宽度和高度是动态的,QGraphicsScene的高度可能大于窗口的高度。所以我无法追踪单块。

我尝试了一些功能: mapFromScene,mapToScene,mapFromGlobal,...但我不知道,这些功能如何运作,但我得到的位置是不对的。

在我看来,位置应该通过QGraphicalView的滚动条和窗口的大小来计算,但是很难精确计算并且它不是正确的解决方案。

有些想法,如何在图形场景中获得真实的位置?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

与其他图形框架一样,QGraphics使用多个坐标系,您需要考虑在处理坐标时您正在使用哪个系统。

我们可以将QGraphicsScene视为一个世界,其中有QGraphicsItem s(或QGraphicsObject' s代表的对象。如果您希望它们使用信号和插槽)。

要查看世界某个区域,我们会使用一个或多个QGraphicsView s。

为了在不同的坐标系之间进行映射,Qt提供了有用的mapTo和mapFrom函数。

从顶部开始,使用QGraphicsView,我们可以转换坐标并使用QGraphicsView::mapToScene来获取场景坐标系中的坐标。由此,如果项目位于该坐标,我们可以使用QGraphicsItem::mapFromScene获取相对于该项目的坐标。

因此,使用三个级别(视图,场景和项目)考虑坐标所在的系统以及您希望处理它的位置。

  

如何在图形场景中获得真正的位置?

希望您现在应该认为您在MainWindow中提供的坐标位于视图的坐标系中,您可以映射到 场景' s 坐标系。

QPointF scenePoint = mapToScene(event->Pos());

但是,这会使事情过于复杂,您可以通过重载项目自己的mouseMove / Press / Release事件来更轻松地直接处理场景及其包含的项目,这些事件提供了{{ 1}}坐标。

答案 1 :(得分:-2)

我用make my对象解决了这个问题,它继承了QGraphicView(MyQGraphicView),然后我为这个对象声明了函数mousePressedEvent。这对我有帮助。