2014-04-05 1 views
6

x 축을 통해서만 객체를 움직이는 데 문제가 있습니다. 나는 기능이 QVariant itemChange (GraphicsItemChange change, const QVariant & value) 인 무언가에 당신이 필요하다는 것을 안다. 다음과 같은 것을 발견했습니다 :QGraphicsItem은 X 축을 통해서만 객체를 이동합니다.

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이 thing.Here의 코드를 변경하는 방법을 알고하지 않습니다 응답에 대한

#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); 
} 

감사합니다.

답변

7

QGraphicsItem::ItemPositionChange 문서를 참조하십시오. 그것은 :

항목의 위치가 변경됩니다. 이 알림은 ItemSendGeometryChanges 플래그가 사용 설정되어 있고 항목의 로컬 위치가 부모 (즉 setPos() 또는 moveBy() 호출 결과)와 관련하여 변경되면 전송됩니다. 값 인수는 새로운 위치입니다 (즉, QPointF). 원래 위치를 얻으려면 pos()를 호출 할 수 있습니다. 이 알림은 배달 됨으로 itemChange()에서 setPos() 또는 moveBy()를 호출하지 마십시오. 대신 새로운itemChange()에서 조정 된 새 위치를 반환 할 수 있습니다. 이 알림 후에 위치가 변경된 경우 QGraphicsItem은 즉시 ItemPositionHasChanged 알림을 보냅니다.

그리고 우리의 코드에 당신이 이런 식으로이 ItemSendsGeometryChanges 플래그, 그래서 올바른 생성자를 설정 한 표시되지 않습니다 :

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

들으 응답을 위해, 그것은 일 (그냥 난 너무 어지러워) 대기 어떤 시간에 대답 할 몇 가지 질문 :) –

관련 문제