首页 文章

Qt QGraphicView和QGraphicScene鼠标位置

提问于
浏览
0

我有项目显示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 回答

  • 1

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

    我们可以将 QGraphicsScene 视为一个世界,其中有一些对象由 QGraphicsItem (或者 QGraphicsObject' s . 表示,如果你想让它们使用信号和插槽) .

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

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

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

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

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

    希望您现在应该认为您在MainWindow中提供的坐标位于视图的坐标系中,您可以 map to scene's 坐标系 .

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

    但是,这会使事情过于复杂,并且您自己的mouseMove / Press / Release事件会提供 QGraphicsScene 坐标 .

  • -2

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

相关问题