본문 바로가기
SWE/Qt

[Qt] QRect 제대로 사용하기 | QWidget의 위치 좌표 얻기 | QRectF

by S나라라2 2020. 3. 13.
반응형
  • 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() 을 포함하여

 

반응형