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
视为一个世界,其中存在由QGraphicsItem
s(或QGraphicsObject'
s。如果您希望它们使用信号和槽)表示的对象。
要查看世界某个区域,我们使用一个或多个QGraphicsView
s。
为了在不同坐标系之间进行映射,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 不显示在其他机器上