2014-05-23 4 views
2

QGraphicsViewQGraphicsScene입니다. items(QPoint(x, y)) 메서드를 사용하면 주어진 장면 점에서 모든 항목을 검색 할 수 있습니다.
일단이 항목들이 그려지면 이동, 회전 또는 크기 조절이되지 않으므로 모양이 변경되지 않습니다.Qt의 아이템 교차로 정의 된 영역의 색을 지정하십시오.

겹치는 영역의 색만 변경하는 방법이 있는지 알고 싶습니다 (적어도 두 개 이상의 항목이있는 경우).

내 질문을 쓰는 다른 방법은 : 출발점이 주어지면 경계선이 발견 될 때까지 장면의 색을 지정하십시오.
이미지 게시에 대한 평판이 충분하지 않으므로 원하는 결과가 세 개인 예를 here 개 업로드했습니다.

Edit 1 : Nejat의 솔루션은 실제로 두 개의 항목의 모양 내에있는 점을 선택하면 작동하지만 점이 하나의 항목 또는 항목에 속하지 않으면 작동하지 않습니다. (예제를 업로드했습니다. 이 경우 here).

어쩌면 다른 접근 방식을 사용해야합니까? 페인트를 한 후에는 항목을 변경할 필요가 없으므로 "평면/정적"픽셀 지향 솔루션에도 관심이 있습니다. QImage 클래스를 사용할 수 있습니까?

편집 2 : Nejat의 답변이 원래 질문에 맞았습니다. Btw, 내 목적을 위해 나는 QImage을 사용하여 모든 모양을 그리고 마지막으로 "홍수 채우기"알고리즘을 사용하여 원하는 영역을 채 웁니다.

답변

0

QGraphicsItem::shape()을 사용하면 QPainterPath을 반환하여 항목의 모양을 검색 할 수 있습니다. 교차로 경로를 촬영에 사용할 수 있습니다

QPainterPath QPainterPath::intersected (const QPainterPath & p) const; 

그래서 당신이 같은 두 항목의 교차 경로를 얻을 수 있습니다 :

painter->setBrush(QColor(122, 163, 39)); 
painter->drawPath(intersectedPath); 
:

QPainterPath intersectedPath = item1->shape()->intersected(item2->shape()); 

을 이제 당신에 의해 교차 된 영역을 채울 수 있습니다

+0

이 솔루션은 내 설명에서 정보가 부족하여 부분적으로 작동합니다. 나는 "편집 1"에 새로운 정보를 추가했습니다. – diegob

+0

이 솔루션에는 요점이 필요하지 않습니다. 그냥 교차 영역을 가져 와서 브러시로 칠할 수 있습니다. – Nejat

+0

시작점을 사용하여 * Items() * 메서드를 호출하여 그 지점에서 Items 목록을 검색합니다. 그런 다음 솔루션을 사용하여 겹치는 영역을 계산할 수 있습니다. 그러나 편집 (Edit 1 그림에서) 항목 (QPoint p) 메소드를 호출하면 빨간색 영역의 아무 곳에서나 'p'를 사용하여 빈 목록을 반환합니다. 일부 모양을 그릴 때 QImage를 사용할 수 있다고 생각합니까? – diegob