2012-05-03 1 views
0

QGraphicsView에 유한 오토 마타를 표시하고 싶습니다. Subclassing QGraphicsItem 상태 (state)를 나타내는 클래스가 있습니다 : Node은 상태 간 이동을 지정하는 Link 인스턴스에 대한 포인터를 보유합니다. 각 링크는 원점과 목적지 (Node 인스턴스에 대한 포인터)도 보유합니다.다른 개체를 이동하여 특정 QGraphicsObject 업데이트

링크 상태를 이동하여 링크를 업데이트 (다시 그리기)하고 싶습니다. paint()으로 전화를 걸거나 링크가 강제로 업데이트되도록 할 수는 없습니다.

노드 구현 :

Node::Node(QGraphicsItem * parent) : 
    QGraphicsObject(parent) 
{ 
    setFlag(ItemIsMovable); 
    setFlag(ItemSendsGeometryChanges); 
    setCacheMode(DeviceCoordinateCache); 
    setZValue(-1); 
} 

void Node::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    QPen pen(Qt::black); 
    if(option->state & QStyle::State_Selected) 
    { 
     pen.setStyle(Qt::DotLine); 
     pen.setWidth(2); 
    } 
    painter->setPen(pen); 
    painter->drawEllipse(-m_size.width()/2,-m_size.height()/2,m_size.width(),m_size.height()); 
    painter->drawText(boundingRect(),Qt::AlignCenter,m_label); 
} 

QRectF Node::boundingRect() const 
{ 
    return QRectF(topLeft(),m_size); 
} 
//... 

void Node::addLink(Link* newLink) 
{ 
    links.append(newLink); 
} 

// protected members 
QVariant Node::itemChange(GraphicsItemChange change, const QVariant &value) 
{ 
    switch (change) 
    { 
    case ItemPositionHasChanged: 
     foreach (Link *link, links) 
     { 
      link->update(); // This has no effect 
     } 
     break; 
    default: 
     break; 
    }; 
    return QGraphicsItem::itemChange(change, value); 
} 

링크 구현 :

Link::Link(QGraphicsItem *parent) : 
    QGraphicsObject(parent) 
{ 
    setFlag(ItemIsMovable); 
    setFlag(ItemSendsGeometryChanges); 
    setCacheMode(DeviceCoordinateCache); 
    setZValue(-1); 
} 

Link::Link(Node *From, Node *To, QGraphicsItem *parent): 
    QGraphicsObject(parent), 
    from(From), 
    to(To) 
{ 
    setFlag(ItemIsMovable); 
    setFlag(ItemSendsGeometryChanges); 
    setCacheMode(DeviceCoordinateCache); 
    setZValue(-1); 
} 

void Link::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    m_painter = painter; 
    QPen pen(Qt::black); 
    if(option->state & QStyle::State_Selected) 
    { 
     pen.setStyle(Qt::DotLine); 
     pen.setWidth(2); 
    } 
    painter->setPen(pen); 
    painter->drawLine(from->pos(),to->pos()); 
} 

QRectF Link::boundingRect() const 
{ 
    return QRectF(from->pos(),to->pos()); 
} 

답변

0

귀하의 링크가 ItemPositionChange가 호출되기 때문에 사용자가 움직이는대로 ItemPositionHasChanged보다는 ItemPositionChange를 사용할 필요가 노드를 연결하는 것으로 보인다 때문에 그 아이템.

그런 다음 노드가 여전히 노드에 연결되도록 링크의 위치를 ​​업데이트하고 해당 노드의 update()를 호출해야합니다.

그래서 ItemPositionHasChanged는 ItemPositionChange 여야하며 노드가 변경 될 때가 아니라 링크가 변경 될 때 노드를 업데이트해야합니다.