2010-02-24 3 views
2

Qt와 함께 제공되는 fridge magnets example을 수정하여 다른 라벨 위로 드래그하여 놓으면 드래그 한 라벨 아래에있는 라벨이 옆으로 밀려서 서로 겹치지 않아야합니다.Qt 냉장고 자석의 라벨이 중복 됨

colliding mice example에서 QGraphicsScene을 사용하여 QGraphicsItem 마우스를 그리는 콜리 전이 감지 된 방법과 scene() -> collidingItems (this)가 충돌하는 마우스를 확인하는 방법을 살펴 보았습니다.

문제는 냉장고 자석 예제가 QGraphicsScene 대신 QWidget을 상속하는 클래스를 사용하므로 충돌이 발생할 때 확인할 수있는 collidingItems() 메소드가 없다는 점입니다.

어떻게해야합니까?

답변

2

QWidget의 위치와 크기는 geometry()에서 얻을 수 있으며 QRect을 반환합니다. QRect의 기능은 intersects()이며 다른 문자와 교차하는지 알려줍니다. QRect. 놓기가 완료되면 모든 레이블을 반복하고 그 중 하나가 새 위치와 교차하는지 확인합니다.

(당신이 dragwidget에 각 레이블의 QList<DragLabel*>을 유지하기 위해 dragwidget을 수정할 경우이 쉬울 것입니다.)

QRect droppedRect = newLabel->geometry(); 
foreach(DragLabel* label, dragLabelList) 
{ 
    if (droppedRect.intersects(label->geometry()) 
    { 
    // Add to the list of covered labels that need to be moved. 
    } 
} 

열심히 부분 : 교차로가있는 경우, 방해가 기존의 레이블을 이동 .

아마도 다음과 같은 알고리즘을 시도해보십시오. 방해가되는 라벨을 최소 이동 거리의 방향으로 이동하십시오. 이제 다른 모든 레이블과 비교하여 확인하십시오. 덮인 사람은 모두 같은 방향으로 움직여야합니다. 모든 레이블이 발견 될 때까지 반복하십시오.

관련 문제