본문 바로가기
코딩취미/Python

PySide6에서 sizeHint()와 resizeEvent의 크기 차이 이해하기

by 브링블링 2025. 2. 19.
반응형

PySide6에서 sizeHint()와 resizeEvent의 크기 차이 이해하기

PySide6로 GUI 애플리케이션을 개발할 때, 위젯의 권장 크기실제 할당된 크기가 다를 수 있습니다. 특히 self.sizeHint().width()와 resizeEvent()에서 확인하는 크기가 왜 다른지 궁금하신 분들을 위해, 이 포스팅에서는 두 메서드의 역할과 차이점을 상세히 설명합니다.

 

내용 정리

1. sizeHint()의 의미

  • 권장 크기를 반환하는 메서드입니다.
  • 위젯 내부의 내용, 레이아웃, 폰트 크기 등 여러 요소를 고려하여 "이 정도 크기가 적당하다"는 제안을 제공합니다.
  • 부모 위젯이나 레이아웃 매니저가 위젯의 실제 크기를 결정할 때 참고하는 제안값(suggestion) 입니다.

2. resizeEvent에서 확인하는 크기

  • 위젯이 실제로 할당된 **실제 크기(geometry)**를 나타냅니다.
  • 부모 위젯, 레이아웃, 창 관리자 등의 여러 요소에 의해 최종 결정됩니다.
  • 사용자가 창 크기를 변경하거나 레이아웃의 영향을 받을 경우, resizeEvent()를 통해 전달되는 크기는 sizeHint()와 다를 수 있습니다.

3. 왜 크기가 다른가?

항목 sizeHint() resizeEvent에서 확인하는 크기
의미 위젯이 권장하는(default) 크기 부모/레이아웃 매니저에 의해 할당된 실제 크기
계산 시점 위젯의 내부 속성과 레이아웃 기준으로 미리 계산됨 위젯이 배치된 후 최종적으로 결정됨
변경 가능성 제안값으로 고정되어 있음 사용자의 조작, 부모 위젯에 의한 크기 변경 가능
참고용도 레이아웃 매니저에 의해 참고되는 값 위젯의 현재 상태를 확인할 때 사용

예시:
위젯이 sizeHint()로 400x300을 제안하더라도, 부모 위젯의 레이아웃이나 사용자의 창 크기 변경에 따라 실제 크기는 600x450 등이 될 수 있습니다.

반응형

예제 코드

아래 코드는 sizeHint()와 resizeEvent에서 반환되는 크기를 비교하여 출력하는 예제입니다.

import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
from PySide6.QtCore import Qt

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.label = QLabel("위젯 크기 확인", self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        self.setLayout(layout)

    def sizeHint(self):
        # 내부 내용과 레이아웃을 고려하여 권장 크기를 반환
        return super().sizeHint().expandedTo(self.minimumSizeHint())

    def resizeEvent(self, event):
        super().resizeEvent(event)
        # resizeEvent에서 실제 할당된 크기를 확인
        actual_size = self.size()
        hint_size = self.sizeHint()
        print("실제 크기 (resizeEvent):", actual_size.width(), "x", actual_size.height())
        print("권장 크기 (sizeHint):", hint_size.width(), "x", hint_size.height())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWidget()
    window.show()
    sys.exit(app.exec())

 

실행 결과 예시:

  • 콘솔에 resizeEvent가 발생할 때마다 현재 위젯의 실제 크기권장 크기가 출력됩니다.

정리 및 주의 사항

  • **권장 크기(sizeHint)**는 위젯이 "이 정도 크기가 적당하다"는 제안을 나타내며, 레이아웃 매니저가 이를 참고하여 크기를 결정합니다.
  • 실제 크기는 부모 위젯, 레이아웃, 창 관리자 등 여러 외부 요인에 의해 최종적으로 결정됩니다.
  • 개발 시에는 두 값을 혼동하지 않고, 필요한 상황에 따라 적절한 값을 사용해야 합니다.
    • 예) 초기 레이아웃 설계 시에는 sizeHint()를 참고하고, 동적 크기 변경 상황에서는 resizeEvent에서 확인한 값을 활용합니다.
반응형