2011-08-10 2 views
0

안녕하세요. 읽고 감사드립니다. QGraphicsView에서 마우스를 드래그하는 동안 여러 QGraphicsItems의 위치를 ​​올바르게 양자화하는 데 문제가 있습니다. 내가 설정 한 시스템은 QGraphicsItem을 한 번에 하나씩 만 드래그하면 올바르게 양자화됩니다. 그러나 여러 항목을 선택하고 드래그하면 주 항목 (마우스 바로 아래에있는 항목) 만 양자화되며 나머지는 지속적으로 설정됩니다. . 어떤 도움을 주셔서 감사합니다. 관련 코드는 다음과 같습니다.QGraphicsView에서 마우스를 드래그하는 동안 여러 QGraphicsItems의 위치를 ​​양자화하는 방법은 무엇입니까?

QGraphicsRectItem에서 상속받은 MutaEvent라는 클래스에 있습니다. 나는() 함수를 mouseMoveEvent()와 setPos를 재정의 한 :

static QPointF quantizePoint(QPointF point,double xQuant, double yQuant) 
{ 
    double x = quantize(point.x(),xQuant); 
    double y = quantize(point.y(),yQuant); 
    QPointF quantPoint(x,y); 
    return quantPoint; 
} 

이 어떤 도움이 많이 주시면 감사하겠습니다 :

void MutaEvent::mouseMoveEvent(QGraphicsSceneMouseEvent * event) 
{ 
    QGraphicsRectItem::mouseMoveEvent(event); 
    setPos(pos()); 
} 

void MutaEvent::setPos(const QPointF &pos) 
{ 
    QGraphicsRectItem::setPos(Muta::quantizePointD(pos,30,15)); 
    emit posChanged(objectID,pos); 
} 

다음 비트가 무타라는 네임 스페이스의 정적 기능입니다!

답변

0

QGraphicsItem::itemChange 보호 기능을 무시하십시오. 여기에서 항목 위치가 변경되기 전에 (QGraphicsItem::ItemPositionChange) 알림을 받고 값을 수정할 수 있습니다. 이 방법은 변화가 시작되었다 아무리 (마우스 이동, 코드에 설정된 그룹의 일부 등)

내가 문제의 일부 QGraphicsItem::setPos()setPos() 것을 의미한다 하지 가상 것을 의심이라고 호출자가 MutaEvent*의 인스턴스를 QGraphicsItem*으로 처리하는 경우 함수가 호출되지 않습니다. 물론 Qt 프레임 워크의 모든 곳에서 그렇습니다. 물론 MutaEvent 클래스에 대한 지식이 없기 때문입니다. 이러한 이유로 그들은 가상 itemChange 메서드를 제공합니다.

0

선택한 모든 항목이 MutaEvent 클래스입니까? setPos()가 각 선택된 항목에 대해 호출되므로 그렇지 않다면 기본 구현을 사용합니다.

제대로 작동하려면 마우스 이벤트 처리 기능을 구현해야 할 수도 있습니다. 그런데 MutaEvent :: mouseMoveEvent에서 setPos (pos())를 호출해도 아무런 효과가 없습니다.

관련 문제