QGraphicsItem仅通过X轴移动对象

时间:2014-04-05 14:02:42

标签: c++ qt

我只是通过x轴移动对象时遇到问题。我知道你需要一些功能QVariant itemChange ( GraphicsItemChange change, const QVariant & value )。我找到了类似的东西:

QVariant CircleItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if (change == ItemPositionChange)
            return QPointF(pos().x(), value.toPointF().y());
    return QGraphicsItem::itemChange( change, value );
}

但它不起作用。我是Qt的新手,所以我不知道,如何改变这个东西。这是我的GraphicsItem的代码:

#include "circleitem.h"

CircleItem::CircleItem()
{
    RectItem = new RoundRectItem();
    MousePressed = false;
    setFlag( ItemIsMovable );
}

void CircleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    if( MousePressed )
    {
        painter->setBrush( QBrush( QColor( 0, 0, 255 ) ) );
        painter->setPen( QPen( QColor( 0, 0, 255 ) ) );
    }
    else
    {
        painter->setBrush( QBrush( QColor( 255, 255, 255 ) ) );
        painter->setPen( QPen( QColor( 255, 255, 255 ) ) );
    }
    painter->drawEllipse( boundingRect().center(), boundingRect().height() / 4 - 7, boundingRect().height() / 4 - 7 );
}

QRectF CircleItem::boundingRect() const
{
    return RectItem->boundingRect();
}

void CircleItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    MousePressed = true;

    update( QRectF().x(), boundingRect().y(), boundingRect().width(), boundingRect().height() );
    QGraphicsItem::mousePressEvent( event );

}

void CircleItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    MousePressed = false;

    update( QRectF().x(), boundingRect().y(), boundingRect().width(), boundingRect().height() );
    QGraphicsItem::mouseReleaseEvent( event );

}

QVariant CircleItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if (change == ItemPositionChange)
            return QPointF(pos().x(), value.toPointF().y());
    return QGraphicsItem::itemChange( change, value );
}

感谢您的回答。

1 个答案:

答案 0 :(得分:7)

阅读QGraphicsItem::ItemPositionChange的文档。它说:

  

项目的位置发生变化。如果是,则发送此通知   ItemSendsGeometryChanges标志已启用,当项目为本地时   相对于其父级的位置变化(即,作为调用的结果   setPos()或moveBy())。 value参数是新位置(即a   QPointF)。你可以调用pos()来获得原始位置。不要打电话   这个通知是itemChange()中的setPos()或moveBy()   交付使用;相反,您可以从中返回新的,调整后的位置   itemChange()。在此通知之后,QGraphicsItem立即发送   如果位置发生变化,则为ItemPositionHasChanged通知。

在我们的代码中,我没有看到你设置了这个ItemSendsGeometryChanges标志,所以正确的构造函数是这样的:

CircleItem::CircleItem() // where is parent parameter?
{
    RectItem = new RoundRectItem();
    MousePressed = false;
    setFlag(ItemIsMovable | ItemSendsGeometryChanges);
}