2012-04-24 8 views
0

저는 Qt를 처음 사용하기 때문에이 질문에 답할 수 있습니다. 그 말은 -QGraphicsView 또는 QGraphicsScene을 사용하여 큰 이미지 내에 이미지 오버레이

서브 클래 싱 된 QGraphicsView 내에서 이미지를 렌더링하고 있습니다. addPixmap()을 사용하여 이미지를 픽스맵으로 장면에 추가했습니다. 특정 위치에있는 더 큰 이미지 위에 작은 이미지를 오버레이 (blit)하고 싶습니다. addPixmap()을 다시 호출하여 작은 이미지를 장면에 추가 할 수도 있지만 항상 왼쪽 위 모서리에 표시됩니다. 나는 그 좌표를 직접 설정하고 싶다.

어떻게하면됩니까?

감사합니다.

답변

1

QGraphicsScene::addPixmap은 추가 된 QGraphicsPixmapItem에 대한 포인터를 반환합니다. 당신의 위치를 ​​설정하려면, 당신은 같은 것을 할 수 있습니다

QGraphicsPixmapItem *item = scene->addPixmap(yourPixmap); 
item->setPos(50, 50); // sets position to scene coordinate (50, 50) 

다른 이미지 위에 이미지를 오버레이하려면

, 당신은 Z-값에 대해 알고 있는지 확인하십시오. 자세한 내용은 QGraphicsItem documentation을 참조하십시오. 기본적으로 z 값은 스태킹 순서를 결정합니다.

마지막으로 QGraphicsItems의 육아를 숙지하십시오. QGraphicsItem에 부모 항목이있는 경우 좌표가 부모 좌표로 표시된다는 것을 의미합니다 (다른 것들 중에서도). 따라서 항목의 위치가 (0, 0)이지만 장면 위치가 (50, 50) 인 항목의 하위 항목 인 경우 하위 항목은 (50, 50)에 표시됩니다. 따라서, 위의 예를 주어, 당신은 할 수 :

QGraphicsPixmapItem *childItem = new QGraphicsPixmapItem(item); 

이것은 부모가 "항목"입니다 새 항목 "ChildItem을"을 만듭니다. 그것들의 좌표는 (0, 0)입니다. 아직 설정되어 있지 않기 때문에, 좌표는 (50, 50)입니다. 왜냐하면 그것은 "item"의 자식이기 때문입니다. 항목의 부모를 지정하면 하위 항목을 장면에 추가 할 필요가 없습니다. 암시 적으로 추가됩니다.

+0

그래서 큰 이미지가 장면 내에서 오프셋되면 (사각형 상자 안에있는 사각형 이미지이므로) 어떤 레퍼런스 프레임이 안에서 설정된 마우스 이벤트입니까? QMouseEvent() 서브 클래 싱 된 QGraphicsView 내에서 (50, 50) 좌표를 제공하는 경우 이러한 좌표는 그래픽보기에 상대적입니까? 큰 이미지의 픽셀과 일치하도록 좌표를 변환하는 쉬운 (자동화 된) 방법이 있습니까? –

+0

예, 좌표는 뷰 좌표입니다. QGraphicsView에는 주어진 좌표에있는 항목에 대한 포인터를 반환하는 itemAt() 메서드가 있습니다. 부모 항목 일 수도 있고 자식 일 수도 있습니다 ... QGraphicsItem :: parentItem을 사용하여 항목에 부모가 있는지 여부를 확인할 수 있습니다. 네, 좌표를 쉽게 변환 할 수 있습니다 : QGraphicsItem, QGraphicsScene, QGraphicsView의 매핑 함수를보십시오. 또한 좋은 설명은 [The Graphics View Coordinate System] (http://qt-project.org/doc/qt-4.8/graphicsview.html)을 참조하십시오. – Anthony

+0

적어도 내 경험에 따르면 QGraphicsView를 서브 클래 싱하는 것보다 QGraphicsItem (귀하의 경우에는 QGraphicsPixmapItem) 또는 QGraphicsScene을 서브 클래 싱하는 것이 훨씬 더 유용합니다. 이것들은 모두 마우스 핸들러를 가지고 있습니다. – Anthony