Не удается сопоставить координату QGraphicsView с QGraphicsScene

У меня QGraphicsView содержит QGraphicsScene, который загружает изображение. Что делает мое приложение, так это позволяет пользователю аннотировать это изображение, чтобы я мог получить информацию о координатах области аннотации пользователя этого изображения. Для большей наглядности сделаю вот такую ​​картинку:

введите описание изображения здесь

Мне нужна точная информация о координатах, основанная на координате изображения, поскольку я добавляю растровое изображение в сцену, я думаю, что изображение и сцена имеют одну и ту же систему координат. Но QGraphicsView и сцена имеют разные координаты, как показано на рисунке, и на моем компьютере они различаются на 5 пикселей по ширине и 1 пиксель по высоте (всегда ли это?).

Я использую функцию 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 используют одну и ту же систему координат, я прав? По этой причине я обновляю картинку так:

введите описание изображения здесь

Теперь я принимаю предложение Эффджэ. Я устанавливаю eventFilter в View, и теперь координата mouseClick основана на View и Scene. Спасибо.


person hakunami    schedule 12.07.2012    source источник


Ответы (1)


Я думаю, что проблема в том, что событие mousePressEvent исходит из главного окна, а не из самого QGraphicsView. MousePressEvent дает вам координаты вашего окна, включая любые границы или украшения.

Чтобы решить эту проблему, вы можете создать подкласс QGraphicsView и обработать там mousePressEvent точно так же, как и в MainWindowClass.

Быстрым, но, возможно, менее привлекательным решением было бы установить фильтр событий в QGraphicsView. Для этого используйте метод installEventFilter QObject.

person effjae    schedule 12.07.2012
comment
Если я установлю eventFilter в View, View сначала получит mouseEvent? Тогда информация о координатах будет основана на View? Следующий шаг - карта, я прав? - person hakunami; 12.07.2012
comment
Привет, я обнаружил проблему, думаю, вы ее знаете. Я добавляю Rect в сцену, когда я щелкаю в этой области прямоугольника, я не могу обнаружить событие mousePressEvent, почему? - person hakunami; 13.07.2012