c++ - Qt QGraphicsView 和 QGraphicSscene 鼠标位置

标签 c++ qt graph qgraphicsview qgraphicsscene

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

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

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

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

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

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

最佳答案

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

我们可以将 QGraphicsScene 视为一个世界,其中存在由 QGraphicsItemQGraphicsObject 表示的对象. 如果你想让他们使用信号和槽)。

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

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

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

因此,通过三个层次( View 、场景和项目)考虑坐标在哪个系统中以及您希望在何处处理它。

how get true position on graphic scene?

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

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

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

关于c++ - Qt QGraphicsView 和 QGraphicSscene 鼠标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539905/

相关文章:

Qt : has initializer but incomplete type 中的 C++ 错误

c++ - Make_shared - 自己的实现

c++ - 如何让 QML 容器中的最后一项填充剩余空间?

c++ - 在 Mouse Proc C++ Win32 中重复消息

c++ - 编译器如何传递 `std::initializer_list` 值? (或 : how can I get around a universal overload with one? )

c++ - 当子部件依赖于父部件时崩溃

qt - 使用Qt Creator编码时如何查看Qt源代码?

python-3.x - 广度优先搜索 : Shortest Path using Python

python - 我可以在 Yed-Graphs 上使用 Python 的图算法吗?

java - 图:找到一种算法来确定矩形迷宫中从一点到另一点的最短路径?