- Window Geometry
QWidget 은 위젯의 좌표를 전달해주는 메소드를 다양하게 제공해 주고 있다.
이러한 메소드는 2가지 종류로 나눠볼 수 있다.
- 윈도우 프레임을 포함한 좌표 계산 :
이 메소드를 통해 얻은 좌표값은 마우스 커서의 좌표와 동일하다.
ex) x(), y(), frameGeometry(), pos(), move()
- 윈도우 프레임을 제외한 좌표 계산 :
윈도우 프레임을 제외한 좌표계산이란 순수하게 client area에서 계산한 좌표값이다.
ex) geometry(), width(), height(), rect(), size()
-
Window frame 기준의 QWidget 좌표 얻는 방법
QPoint position = mapToGlobal(QWidget->frameGeometry().bottomLeft());
위의 코드에서 QWidget을 본인의 위젯이름으로 수정하면 된다.
처음에는 frameGeometry() 가 아닌, rect()를 호출하여 mapToGlobal로 좌표값을 전환하였는데, 틀린 좌표값이 나왔었다. 그 이유는 rect는 window frame을 포함하지 않는 parent 위젯에서 고려된 좌표값을 전달해주기 때문이다.
-
QRect
QWidget의 rect() 메소드를 사용하면 위젯의 시작 좌표와 너비, 높이를 얻어올 수 있다.
그러나 rect는 윈도우 프레임을 제외한 좌표를 전달해준다. 즉, 실제 사용자가 보는 전체 스크린과의 좌표와 차이점이 있을 수 있다.
QWidget에서 rect() 메소드를 통해 리턴받는 QRect값은 항상 다음과 같다.
QRect(0, 0, width(), height())
-
QRect에서 bottomLeft() 좌표를 얻으면, 위젯 아래보다 조금 높은 좌표를 반환하는 이유
QWidget(A) 의 rect().botomLeft() 를 얻어서 그 곳에 다른 위젯(B)을 생성시키면, 항상 B가 A의 아래 부분을 조금 가리고 있다. 그래서 항상 위젯 B를 특정 픽셀만큼 아래로 이동시켰는데 그 이유를 찾을 수 있었다.
Qt 공식 다큐먼트에 따르면 right() 함수가 리턴하는 값은 left()+width()-1이고, bottom() 함수가 리턴하는 값은 top()+height()-1 이라고 한다.
그래서 당연히 bottomRight() 과 bottomLeft()도 -1 만큼 작은 값을 리턴한다.
따라서 위젯의 실제 하단 코너값을 얻고싶다면 Qt에서 추천하는 방법은 다음과 같다.
위젯의 오른쪽 X좌표 : x() + width()
위젯의 아래 y좌표 : y() + height()
-
QRectF
또 다른 방법은 QRectF 클래스를 사용하면 된다.
QRectF 클래스는 정확한 좌표값을 전달해준다. QRectF::right(), QRectF::bottom() 을 포함하여