2016-10-21 5 views
1

다른 하나가 움직이면 QGraphicsScene에 하나의 QGraphicsItem을 이동 (또는 크기 변경)하고 싶습니다. 그러나 QGraphicsScene 개체에서 QGraphicsItem에 액세스하려고하면 충돌이 발생합니다.QGraphicsItem의 위치를 ​​다른 QGraphicsItem에 의존하게 만드는 방법은 무엇입니까?

여기에 가짜 예제가 있습니다. 나는 자동으로 원하는 : 내가 클릭 한 RedItem을 끌어

  1. 크기 조정 BlueItem의 폭입니다.

  2. 을 클릭하여 끌면 RedItem으로 이동하십시오.

더미 번호 :

redItem.h (A 픽스맵 항목)

#include <QGraphicsPixmapItem> 

class RedItem : public QGraphicsPixmapItem 
{ 
public: 
    RedItem(); 

protected: 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event); 
}; 

redItem.cpp

RedItem::RedItem() 
{ 
    setPixmap(QPixmap(redPixMap)); 
    setFlags(ItemIsMovable); 
    setCacheMode(DeviceCoordinateCache); 
} 

void RedItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{ 
    setPos(event->scenePos(),0); //I can override this part just fine. 
} 

blueItem.h (A 사각형 크기 조정 항목)

#include <QGraphicsRectItem> 

class BlueItem : public QGraphicsRectItem 
{ 
public: 
    BlueItem(); 

protected: 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event); 
}; 

blueItem.cpp는

#include <QGraphicsView> 
#include "blueItem.h" 
#include "redItem.h" 


class GraphicsViewWidget : public QGraphicsView 
{ 
    Q_OBJECT 
public: 
    explicit GraphicsViewWidget(QWidget *parent = 0); 

protected: 
    virtual void mouseMoveEvent(QMouseEvent *event); 

private: 
    RedItem *red; 
    BlueItem *blue; 
}; 

graphicsViewWidget.cpp

#include "graphicsViewWidget.h" 
#include <QRectF> 

void Qx::createItem(int frame) 
{ 

    red = new RedItem; 
    red->setPos(0, 0); 
    scene()->addItem(red); 


    blue = new BlueItem; 
    blue->setPos(10, 10); 
    scene()->addItem(blue); 
} 

void GraphicsViewWidget::mouseMoveEvent(QMouseEvent *event) //QGraphicsSceneMouseEvent 
{ 
    QGraphicsView::mouseMoveEvent(event); 

    //if(redItem moves) 
    // resize blueItem; 

    //if(blueItem moves) 
    // move redItem; 

} 

어떤 도움이나 조언이 크게 감상 할 수 redItem.cpp

graphicsViewWidget.h합니다 (GraphicsView)와 유사하다.

답변

3

항목 B를 항목 A의 자식으로 설정하면 해당 좌표 공간에 살게됩니다. 즉, 이동, 크기 조정, 회전과 같은 모든 변환이 부모 항목에 적용되는 모든 내용은 모든 자녀와 자녀에게 적용됩니다.

+0

흥미 롭습니다! 나는 인상적인 항목 아래에서만 장면에서 만들 수 있었다. 그냥 명확히하기 위해 항목 A의 생성자에서 항목 B를 초기화한다는 것을 의미합니까? –

+1

장면이나 켜기/끄기 장면과 같은 다른 기존 항목에 항목을 추가 할 수 있습니다. 부모 나'setParentItem()'함수를 전달하는 생성자를 사용할 수있다. 부모가 이미 장면에 추가 된 경우 새 객체도 자동으로 추가됩니다. – dtech

+0

이 작업을 수행하는 예에 대한 링크가 있습니까? –