Qt Graphics에서의 좌표 체계 이해하기
여기서는 Qt Graphics에서의 좌표 체계에 대해 알아보기로 한다. Scene에 item들을 원하는 곳에 위치시키기 위해서는 Qt에서 사용하는 좌표 체계를 이해하고 사용할 수 있어야만 한다. Graphics View는 모두 3종류의 좌표체계를 사용하는데 다음과 같다.
(1) item's coordinate system
(2) scene's coordinate system
(3) view's coordinate system
만약 어떤 item상에서 마우스 클릭이 발생했다면, QGraphicsSceneMouseEvent::pos() 함수로 클릭된 좌표값을 구할 수 있는데 이때의 좌표값은 item's coordinate system 의 값이다. scenePos() 및 sceneBoundingRect() 로 구한 좌표값은 scene's coordinate system을 따른다. 주의할 점은 item들은 parent-child 관계로 연결될 경우 child 들은 parent의 item's coordinate system을 따른다는 것이고 따라서 pos()함수로 계산된 좌표값은 parent의 item's coordinate system상의 값이다.
아래에서 생성된 item을 살펴 보자. 3개의 QGraphicsRectItem을 생성했으며 크기는 20x20이고 위치는 서로 다른 값을 갖는다.
QGraphicsRectItem *itemA = new QGraphicsRectItem(-100, -100, 200, 200);
QGraphicsRectItem *itemB = new QGraphicsRectItem(0, 0, 200, 200);
QGraphicsRectItem *itemC = new QGraphicsRectItem(100, 100, 200, 200);
위 item들의 좌표값을 그림으로 보면 다음과 같다.
각 item 들의 생성시 사용한 좌표는 scene 상의 좌표값이다. 아래와 같은 코드를 사용하여 실습해보자. 아래에서 QGraphicsEllipseItem은 중심점은 scene의 원점을 나타낸다. 각각의 item들을 회전시킬 경우 직관적으로 잘 알아볼 수 있게 하기 위해 추가하였다.#include <QApplication>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
QGraphicsRectItem *itemA = new QGraphicsRectItem(-100, -100, 200, 200);
QGraphicsRectItem *itemB = new QGraphicsRectItem(0, 0, 200, 200);
QGraphicsRectItem *itemC = new QGraphicsRectItem(100, 100, 200, 200);
QGraphicsEllipseItem *ellipse = new QGraphicsEllipseItem(-100, -100, 200, 200);
ellipse->setPen(QPen(Qt::red));
//itemB->setTransformOriginPoint(0, 0);
//itemB->setRotation(-45);
scene.addItem(itemA);
scene.addItem(itemB);
scene.addItem(itemC);
scene.addItem(ellipse);
view.show();
return a.exec();
}
위 코드를 실행한 결과는 다음과 같다.
itemA, itemB, itemC를 45도 회전 시켜보자. 아래 코드를 추가하면 된다.
itemA->setRotation(-45);
itemB->setRotation(-45);
itemC->setRotation(-45);
각 item들의 회전한 결과는 다음과 같다. Scene 원점 (0,0)(원의 중심점)이 각 item들의 회전축임을 알 수 있다.
(itemA회전한 경우) (itemB회전한 경우)
회전축의 원점은 setTransformOriginPoint()함수를 사용하여 변경할 수 있다. itemA의 원점을 아래와 같이 변경한 경우를 보자.itemA->setTransformOriginPoint(100, 100);
item을 scene의 다른 위치로 이동하길 원할 경우 setPos()함수를 사용하면된다. 아래는 itemA의 위치를 이동하기 위한 코드 및 결과화면이다.
itemA->setPos(-100,0);
댓글
댓글 쓰기