我有项目显示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 回答
与其他图形框架一样,QGraphics使用多个坐标系,您需要考虑在处理坐标时您正在使用哪个系统 .
我们可以将
QGraphicsScene
视为一个世界,其中有一些对象由QGraphicsItem
(或者QGraphicsObject'
s . 表示,如果你想让它们使用信号和插槽) .要查看世界的某个区域,我们使用一个或多个
QGraphicsView
.为了在不同的坐标系之间进行映射,Qt提供了有用的mapTo和mapFrom函数 .
从顶部开始,使用QGraphicsView,我们可以转换坐标并使用
QGraphicsView::mapToScene
来获取场景坐标系中的坐标 . 由此,如果项目位于该坐标,我们可以使用QGraphicsItem::mapFromScene
获取相对于该项目的坐标 .因此,使用三个级别(视图,场景和项目)考虑坐标所在的系统以及您希望处理它的位置 .
希望您现在应该认为您在MainWindow中提供的坐标位于视图的坐标系中,您可以 map to scene's 坐标系 .
但是,这会使事情过于复杂,并且您自己的mouseMove / Press / Release事件会提供
QGraphicsScene
坐标 .我用make my对象解决了这个问题,它继承了QGraphicView(MyQGraphicView),然后我为这个对象声明了函数mousePressedEvent . 这对我有帮助 .