2014-04-05 13 views
6

Tôi gặp sự cố khi di chuyển đối tượng của mình chỉ qua trục x. Tôi biết bạn cần một cái gì đó với chức năng QVariant itemChange (GraphicsItemChange change, const QVariant & value). Tôi đã tìm thấy một cái gì đó như thế này:QGraphicsItem di chuyển đối tượng chỉ qua trục X

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

Nhưng nó không hoạt động. Tôi mới đến Qt, vì vậy tôi không biết, làm thế nào để thay đổi mã của thing.Here này để GraphicsItem tôi:

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

Cảm ơn đã trả lời.

Trả lời

7

Đọc tài liệu về QGraphicsItem::ItemPositionChange. Nó nói:

Thay đổi vị trí của mục. Thông báo này được gửi nếu cờ ItemSendsGeometryChanges được bật và khi các thay đổi vị trí địa phương của của mặt hàng đó liên quan đến cha mẹ của nó (tức là, do gọi setPos() hoặc moveBy()). Đối số giá trị là vị trí mới (ví dụ: QPointF). Bạn có thể gọi hàm pos() để nhận vị trí ban đầu. Không gọi setPos() hoặc moveBy() trong itemChange() vì thông báo này là được gửi; thay vào đó, bạn có thể trả lại vị trí mới, được điều chỉnh từ itemChange(). Sau thông báo này, QGraphicsItem sẽ gửi ngay thông báo ItemPositionHasChanged nếu vị trí thay đổi.

Và trong mã của chúng tôi Tôi không thấy bạn đã thiết lập ItemSendsGeometryChanges cờ, xây dựng để đúng này như thế này:

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

Thx cho trả lời, nó làm việc (chỉ cần tôi quá choáng váng) chờ một số câu hỏi để trả lời trong một thời gian :) –

Các vấn đề liên quan