2013-07-30 2 views
1

qgraphicsview에서 qgraphicsScene에 2 개의 사용자 정의 qgraphics 항목을 가지고 있습니다. 이제 2 가지 항목 중 하나를 다른 종류로 드래그 앤 드롭 할 수 있기를 바랍니다. 그러나 이것을 위해 어떤 이벤트를 다시 구현해야합니까? 설명서는 약간 혼란 스럽습니다.qt qgraphicsScene에서 드래그 앤 드롭

또한 qgraphicsitem이 삭제되어야하는 qgraphicsitem보다 다른 영역으로 드래그하면 qgraphicsitem이 원래 위치로 돌아가 길 원합니다.

+1

[다음 예] (http://qt-project.org/doc/qt-4.8/examples-draganddrop.html)는 약간의 도움이 될 것입니다. – thuga

답변

5

내가 아는 한 QGraphicsScene 자체에서는 구현되지 않습니다. 당신이를 QGraphicsView 또는 QGraphicsScene에서 자신의 클래스를 파생하고 과부하해야합니다

class MyGraphicsView : public QGraphicsView 
{ 
    Q_OBJECT; 
protected: 
    virtual void mousePressEvent(QMouseEvent* event); 
    virtual void mouseMoveEvent(QMouseEvent* event); 
    virtual void mouseReleaseEvent(QMouseEvent* event); 
    ... 
private: 
    QGraphicsItem *currentDraggedItem; 
}; 

를 QGraphicsView보기/창 작품을 제공 QGraphicsScene이 장면 좌표와 함께 작동하면서 조정합니다.

추가 코드는 같은 :

void MyGraphicsView::mousePressEvent(QMouseEvent* event) 
{ 
    currentDraggedItem = itemAt(event->pos()); 

    QGraphicsView::mousePressEvent(event); 
} 
void MyGraphicsView::mouseReleaseEvent(QMouseEvent* event) 
{ 
    QGraphicsItem *foundItem = itemAt(event->pos()); 
    if(foundItem && currentDraggedItem && 
     foundItem != currentDraggedItem) 
    { 
     // Handle DragDrop Here 
    } 

    QGraphicsView::mouseReleaseEvent(event); 
} 

하나 QGaphicsScene에 대한 작업을 수행합니다. 두 개가있는 경우 - 둘 다 서로를 알아야하며 하나의 QGraphicsView에서 다른 QGraphicsView로 좌표를 변환해야합니다. mapTo ...()를 사용하여.

+0

오,하지만 qgraphicsview 좌표를 사용할 필요가 없습니다, 그냥 다른 하나의 간단한 qgraphicsitem을 구현하고 somehting이 일어나길 원합니다. 제 경우에는 스크래블 게임을 만들고 있습니다. 타일의 문자 : –

+0

QGraphicsScene에서 파생 된 것이 좋습니다. 그것의하기가 어렵지 않다. 또한 몇 가지 코드를 추가했습니다. –

+0

고마워, 난 그냥 초보자 이니, 내 머리 위로하는 방법이라고 생각하기 시작했다. S –

1

이 키는 QGraphicsItems rect를 확인하고 교차하는지 확인하는 것입니다.

따라서 항목을 마우스로 아래로 누르면 현재 위치가 저장됩니다. 이제 마우스를 움직여 마우스를 놓을 때까지 기다릴 수 있습니다. 마우스 버튼을 놓은 상태에서 항목의 경계 사각형이 QRect :: contains (const QRectF)와 교차하는지 확인합니다. 그들이하는 경우에, 당신은 다른 사람에 1 개를 떨어 뜨렸다. 그렇지 않은 경우 그래픽 항목을 이전에 저장된 위치에 애니메이션으로 적용합니다.

장면 공간 좌표에서이 두 가지를 사용하여 교차하는 경계 사각형을 확인할 때 확인하십시오. 변환하거나 QGraphicsItem :: sceneBoundingRect()를 사용하십시오.

+0

흠 그러나 모든 항목이 1보기에 있으며 qgraphicsitem의 정보를 다른 qgraphicsitem으로 보내려면 어떻게해야합니까? –

+0

죄송합니다. 질문을 읽지 않았습니다 ... 나는 그것을 편집 할 것입니다. – TheDarkKnight

+0

질문을 편집했습니다. 정보를 다른 사람에게 전달하는 것이 무슨 뜻인지 잘 모르겠습니다. 그 위치 나 다른 것을 의미합니까? 확실히 하나에서 매개 변수를 얻고 다른 매개 변수를 설정하는 문제입니다. 그렇지 않습니까? – TheDarkKnight