3

我有一个 QGraphicsView 包含一个加载图像的 QGraphicsScene 。我的应用程序所做的是让用户注释此图像,以便我可以获得此图像的用户注释区域的坐标信息。为了更容易理解,我制作了这张图片:

在此处输入图像描述

我想要的是基于图像坐标的确切坐标信息,因为我在场景中添加了像素图,我认为图像和场景具有相同的坐标系。但是,QGraphicsView 和场景的坐标不同,如图所示,在我的电脑中它们的宽度和高度相差 5pix 和 1pix(总是这样吗?)。

我使用mapToScene函数,但我没有得到正确的坐标信息。

我在这里发布了一些代码。

scene = new QGraphicsScene();
scene->addPixmap (pixmapItem);
ui->graphicsView->setScene (scene);


void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if ((event->button() == Qt::LeftButton)&& beginAnnotation) {
        .......   

        QPointF mousePoint = ui->graphicsView->mapToScene(event->pos());
        qDebug() << mousePoint;
    }
}

当我单击图像的左上角时,我希望我能得到 (0,0),但我得到的是 (5,1)。

请帮我。

解决方案:

我认为@effjae 是对的。我的 mainWindow 捕获 mousrPressEvent。当我将图像加载到 View 包含的场景中时,我使用ui->graphicsView->adjustSize();,所以,我认为 View 和 Scene 共享相同的坐标系,对吗?出于这个原因,我将图片更新为:

在此处输入图像描述

现在,我接受 effjae 的建议。我在 View 上安装了一个 eventFilter,现在 mouseClick 的坐标是基于 View & Scene 的。谢谢你。

4

1 回答 1

1

我认为您在这里遇到的问题是您的 mousePressEvent 来自您的主窗口,而不是实际的 QGraphicsView。mousePressEvent 为您的窗口提供坐标,这包括任何边框或装饰。

为了解决这个问题,你可以继承一个 QGraphicsView 并在那里处理 mousePressEvent,与你在 MainWindowClass 中的方式完全相同。

一个快速但可能不太有吸引力的解决方案是在 QGraphicsView 上安装一个事件过滤器。使用 QObject 的方法 installEventFilter 来执行此操作。

于 2012-07-12T10:10:35.063 回答