Search code examples
qtqgraphicsviewqgraphicsitemqgraphicsscene

Draw shift when drawing on QGraphicsView


I have a problem.

I have a class that inherits QGraphicsView, let's suppose it called "g". I reimplemented mousePressEvent method, the code of that method is:

void GraphWidget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::MiddleButton)
        createNode(event->pos().x(), event->pos().y());

    update();
    QGraphicsView::mousePressEvent(event);
}

The code of createNode method is:

Node *GraphWidget::createNode(qreal x, qreal y, int id)
{
    Node* node = new Node(this);
    scene()->addItem(node);
    node->setPos(x, y);
    return node;
}

I use this class "g" as a central widget in my mainwindow class. So it's working like QGraphicsView.

The problem is when I press the middlebutton on the "draw area" - the point is created but not in the place when I clicked - the point is shifted. Why? So when I try to draw those points by pressing the middlebutton - all them are drawed on the wrong place (not under my cursor, they are drawn lefter left and above my cursor position).

How can I fix that?


Solution

  • QGraphicsView and QGraphicsScene have different coordinate spaces. When you call setPos, it should be in scene coordinates, but since your in the mouse event of the view, your x and y are going to be in view coordinates.

    I suspect that mapping your x and y coordinates to the scene space should fix the issue:

    node->setPos( mapToScene(QPoint(x, y) );