我想拥有一个在线监视系统,该系统可以判断当前的形状,但是却获得了非常奇怪的坐标,而且每次创建新对象并拖动它时,其尺寸都会增加1。

初始位置( map 大小为751 x 751,通过输出到qDebug()(绑定(bind)到黄色空间的场景)进行检查):

c++ - 拖动释放后如何正确获取QGraphicsRectItem的位置?-LMLPHP

将其拖动到左上角。

c++ - 拖动释放后如何正确获取QGraphicsRectItem的位置?-LMLPHP

如您在开始时所见,它位于(200; 200)上,但是拖动后处于(-201; -196)。删除它并在具有相同属性的相同位置上创建新形状后,由于新形状不在 map 中,因此看不到新形状,这表明编辑未显示正确的数据。

这是更新编辑的代码:

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

这是我设法简化为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()));
    }
}

这是将QGraphicsScene anchor 定到黄色区域的左上角的方法:
scene->setSceneRect(0, 0, mapSize.width() - 20, mapSize.height() - 20);
ui->graphicsView->setScene(scene);

如何向编辑报告正确的数据?

最佳答案

最好改写itemChange方法,并使用ItemPositionHasChanged通知。您必须在项目上设置ItemSendsGeometryChanges标志,以便它接收这些通知。

当您仍在mouseReleaseEvent方法中时,我不确定是否已设置项目的最终位置。在itemChange中对其进行跟踪将确保数据是有效的,而这正是它的用途。

另外,请注意,“pos”在项目的父坐标中,而“boundingRect”在项目的坐标空间中。如果要确保使用场景坐标,则应使用“scenePos”和“sceneBoundingRect”。如果项目没有父项,则“pos”和“scenePos”将返回相同的值,但“boundingRect”和“sceneBoundingRect”通常会有所不同。

关于c++ - 拖动释放后如何正确获取QGraphicsRectItem的位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41130694/

10-11 22:45
查看更多