Incomputable
Incomputable

Reputation: 2208

How to appropriately get position of QGraphicsRectItem after drag-release?

I wanted to have an online monitoring system that could tell where the shape is currently, but am getting very weird coordinates of the item, also the dimensions of it get higher by 1 each time I create new one and drag it.

Initial position (map size is 751 by 751, checked by outputting to qDebug(), scene bound to yellow space) :

Initial position

Dragging it to the left top corner.

enter image description here

As you can see in the beginning it was on (200;200), but after dragging it is on (-201;-196). After deleting it and creating new shape on the same position with the same properties, new shape can't be seen because it is outside of the map, which suggests that edits don't show correct data.

Here is the code of updating the edits:

void CallableGraphicsRectItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
    QGraphicsRectItem::mouseReleaseEvent(event);
    ptr->updateEdits(this);
}

Here is what I managed to cut down into updateEdits():

void MainWindow::updateEdits(QAbstractGraphicsShapeItem* item)
{
    //stuff not related to scene

    auto posReal = item->scenePos();
    auto pos = posReal.toPoint();

    //create QString from coordinates
    QString coordinate;
    coordinate.setNum(pos.x());
    ui->leftXEdit->setText(coordinate);
    coordinate.setNum(pos.y());
    ui->upperYEdit->setText(coordinate);

    //get width and height for rect, radius for circle    
    auto boundingRectReal = item->sceneBoundingRect();
    auto boundingRect = boundingRectReal.toRect();
    ui->widthEdit->setText(QString::number(boundingRect.width()));
    //disables height edit for circles, not really relevant
    if (!items[currentShapeIndex].isRect)
    {
        ui->heightEdit->setDisabled(true);
    }
    else
    {
        ui->heightEdit->setDisabled(false);
        ui->heightEdit->setText(QString::number(boundingRect.height()));
    }
}

Here is how I anchor the QGraphicsScene to the left top corner of the yellow area:

scene->setSceneRect(0, 0, mapSize.width() - 20, mapSize.height() - 20);
ui->graphicsView->setScene(scene);

How can I report the right data to the edits?

Upvotes: 1

Views: 573

Answers (1)

goug
goug

Reputation: 2444

You're better off overriding the itemChange method and using the ItemPositionHasChanged notification. You have to set the ItemSendsGeometryChanges flag on the item so that it receives these notifications.

I'm not sure that your item's final position has been set when you're still in the mouseReleaseEvent method. Tracking it in itemChange will ensure that the data is valid, and this kind of thing is what it's for.

Also, note that "pos" is in the item's parent coordinates, and "boundingRect" is in the item's coordinate space. You should use "scenePos" and "sceneBoundingRect" if you want to be sure you're using scene coordinates. If the item doesn't have a parent, then "pos" and "scenePos" will return the same values, but "boundingRect" and "sceneBoundingRect" will generally differ.

Upvotes: 1

Related Questions