我怎么知道在单独的 class 中创建的 QGraphicsItem 是否已经在场景中移动(改变了它的位置)?

How can I know if a QGraphicsItem created in a separate class has moved on a scene (changed it's position)?

我在新的 class 中创建了一个 GraphicsItem 并将其发送到另一个文件中的 GraphicsView。我已将标志 ItemIsMovable 设置为 true,我可以移动该项目。

我怎么知道用户把它移到了哪里?而且,我怎样才能手动设置位置?

[基本上我有一个项目,如果用户将它移动到足够靠近正确位置我想自动将它移动到正确位置]

为了获取鼠标事件,我使用了这些函数:

  void Detector::mousePressEvent(QGraphicsSceneMouseEvent *event)
    {
        Pressed = true;
        update();
        QGraphicsItem::mousePressEvent(event);
    }

    void Detector::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
    {
        Pressed = false;
        Moving = false;
        update();
        QGraphicsItem::mouseReleaseEvent(event);
    }

    void Detector::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
    {
        Moving = true;
        update();
        QGraphicsItem::mouseMoveEvent(event);
    }

我目前的想法是也使用绘画算法,并为 Pressed 创建一个类似于下面所示的 if 语句(按下时更改项目的颜色)。

 void Detector::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        QBrush darkBrown(QColor(83,71,65));
        QBrush clickedBrown(QColor(122,83,66));
        //fillBrush.setColor(darkBrown);

        QPolygon DetectorPolygon;
        DetectorPolygon << QPoint(0,0);
        DetectorPolygon << QPoint(15,10);
        DetectorPolygon << QPoint(50,10);
        DetectorPolygon << QPoint(50,20);
        DetectorPolygon << QPoint(15,20);
        DetectorPolygon << QPoint(0,30);

        QPen borderPen;
        borderPen.setWidth(2);
        borderPen.setColor(QColor(152,133,117));

        painter->translate(780,425);

        if (Pressed==true)
        {
            painter->setBrush(clickedBrown);

        }
        else
        {
            painter->setBrush(darkBrown);
        }

        if (Moving==true)
        {

        }
        else
        {

        }

        painter->setPen(borderPen);
        painter->drawPolygon(DetectorPolygon);

    }

本质上:如何获得 QGraphicsItem 的坐标以及如何更改它们?

您可以随时调用 QPointF pos() const; 获取项目的坐标并调用 void setPos(const QPointF &pos); 更改它们。但是如果你只是检查文档应该很清楚。