【发布时间】: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 应用程序。
标签: c++ qt graph qgraphicsview qgraphicsscene