Qt QGraphicsView 和 QGraphicScene 鼠标位置

Posted

技术标签:

【中文标题】Qt QGraphicsView 和 QGraphicScene 鼠标位置【英文标题】:Qt QGraphicView and QGraphicScene mouse position 【发布时间】:2017-03-01 19:02:36 【问题描述】:

我有一个显示 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的滚动条和窗口大小来计算,但是很难精确计算,不是正确的解决方案。

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

【问题讨论】:

不是很清楚你想要什么。所有这些坐标系都是相对的,对于任何给定的 mousePressEvent 实现,无论是小部件还是场景项目,您都将在该对象的坐标系中工作。如果你想要在场景坐标中的鼠标事件,那么重新实现 QGraphicsScene::mousePressEvent。如果你希望它们在视图坐标中,它们重新实现 QGraphicsView::mousePressEvent,等等。我会将“图形场景上的真实位置”解读为暗示 QGraphicsScene::mousePressEvent 是正确的位置,但不清楚。 谢谢,我试试。 为什么要在顶层窗口处理事件?图形场景系统的目的是提供可以与之交互的项目。您可以与项目本身进行各种互动 - 它们旨在让这变得简单。 因为我是 Qt 的菜鸟,我不知道 Qt,它是我的第一个高级 GUI 应用程序。 【参考方案1】:

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

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

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

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

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

因此,对于三个级别(视图、场景和项目),请考虑坐标所在的系统以及您想要处理它的位置。

如何获得图形场景的真实位置?

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

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

但是,这会使事情变得过于复杂,您会发现通过重载项目自己的 mouseMove/Press/Release 事件(这些事件提供QGraphicsScene 坐标)更容易直接处理场景及其包含的项目。

【讨论】:

【参考方案2】:

我通过创建我的对象解决了这个问题,该对象继承了 QGraphicView (MyQGraphicView),然后我为这个对象声明了函数 mousePressedEvent。这对我有帮助。

【讨论】:

以上是关于Qt QGraphicsView 和 QGraphicScene 鼠标位置的主要内容,如果未能解决你的问题,请参考以下文章

Qt Embedded:使用 QGraphicsView 和 QGraphicsWidget 在两个屏幕上显示

Qt QGraphicsView 和 QGraphicScene 鼠标位置

使用 Qt 的 QGraphicsScene/QGraphicsView 进行 2D 游戏

Qt 部署 - QGraphicsView 不显示在其他机器上

QT:我需要通过 QGraphicsScene 获取添加到 QGraphicsView 的图像坐标

QT:QGraphicsView QGraphicsScene QGraphicsItem理解