特地的将prepareGeometryChange()拿出来说是因为它是一个很容易让人忽视掉的一个函数。
用过QGraphicsItem类去绘图的应该都知道每个图元都是有一个矩形的轮廓的,通过在下列函数中设置

QRectF QGraphicsItem::boundingRect() const{
    return QRectF(l, t, w, h);
}

我们再实际使用中的时候会经常去的改变图元的位置,因为你创建的图元不可能永远都是静态的(你可以直接贴个图片得了)
我们会通过函数去绘制我们的图元:

int g_left;    // 左边距参数
void QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
    Q_UNUSED(option);
    Q_UNUSED(widget);
    QColor color = QColor(0x00,0x00,0x00);
    color.setAlpha(50);
    painter->setPen(QPen(color,1));
    painter->setBrush(QColor(0xff,0xff,0xff));
    painter->setOpacity(1);
    painter->drawRect(g_left,t,w,h); 
}

我们可能会通过鼠标的位置去改变左边距的参数

void CursorItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if (event->buttons() == Qt::LeftButton) {
        g_left = event->pos().x();
        prepareGeometryChange();      # 请看这一句 这是重点
        QGraphicsScene::update();     # 伪代码,通知场景刷新图元
    }
}

prepareGeometryChange()的目的在于通知场景即将发生的变化,这样场景会去刷新图元的位置坐标,否则,场景将不会察觉到item的变化,结果也未知。为了避免一些未知异常的产生,每次在修改图片坐标或形状时,按照以下步骤进行:

  • 修改boundingRect中用到的参数数据(坐标)本例中的g_left。

  • 列表然后调用prepareGeometryChange()去通知scene即将发生变化。

  • 列表QGraphicsScene::update();强制让场景层刷新图元数据。