Qt QGraphicsView 和 QGraphicSscene 鼠标位置

Qt QGraphicView and QGraphicScene mouse position

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

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

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

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

我想到应该通过QGraphicalView的滚动条和window的大小来计算位置,但是很难精确计算,这不是正确的解决方案。

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

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

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

要查看世界的某个区域,我们使用一个或多个 QGraphicsViews。

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

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

获得相对于该项目的坐标

所以,有了三个层次(视图、场景和项目),想想坐标在哪个系统中,你想在哪里处理它。

how get true position on graphic scene?

希望您现在应该认为您在主窗口中提供的坐标在视图的坐标系中并且您可以映射到 场景的 坐标系.

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

但是,这会使事情过于复杂,您会发现直接使用场景及其包含的项目会更容易,方法是重载项目自己的 mouseMove/Press/Release 事件,这些事件提供 QGraphicsScene 坐标.

我通过创建我的对象解决了这个问题,它继承了 QGraphicsView (QGraphicsView),然后我为这个对象声明了函数 mousePressed Event。这对我有帮助。