from PySide6.QtWidgets import QWidget, QLabel, QHBoxLayout, QVBoxLayout, QSizePolicy, QLineEdit, QPushButton
class SizePolicyExample(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("사이즈 정책(SizePolicy) 및 스트레치 학습")
C. SizePolicy(사이즈 정책)
C.1 SizePolicy란?
창의 크기가늘어나거나 줄어들 때 위젯이 어떤 방식으로 변화하는지결정하는 규칙.
옵션
의미
Fixed
크기 고정, 절대 변하지 않음
Expanding
가능하면 최대로 늘어남
Minimum
최소 크기만 유지
Preferred
선호 크기 유지, 필요하면 늘어남
C.2 코드에서 적용된 부분
# [1] SizePolicy 설정
# SizePolicy는 부모 창의 크기가 변할 때 위젯의 크기를 어떻게 조절할 것인지 결정하는 정책입니다.
label = QLabel("텍스트 입력: ")
line_edit = QLineEdit()
# 가로 방향은 가능한 한 늘어나고(Expanding), 세로 방향은 고정(Fixed)
line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
가로 방향으로는 늘어남
세로 방향은 고정(똑같은 높이 유지)
D. HBoxLayout 레이아웃에 가로 배치하기
# [2] 첫 번째 가로 레이아웃 : 텍스트 + 입력창
h_layout_1 = QHBoxLayout()
h_layout_1.addWidget(label)
h_layout_1.addWidget(line_edit)
E. 스트레치(stretch)
레이아웃에 남는 공간을비율로 어떻게 나눌지결정하는 값.
# [3] 버튼 3개 생성
button_1 = QPushButton("버튼1")
button_2 = QPushButton("버튼2")
button_3 = QPushButton("버튼3")
# [4] 스트레치 설정
# 버튼1은 stretch=2 → 2배 넓은 공간 차지
# 버튼2, 버튼3은 stretch=1 → 동일 비율로 차지
h_layout_2 = QHBoxLayout()
h_layout_2.addWidget(button_1, 2)
h_layout_2.addWidget(button_2, 1)
h_layout_2.addWidget(button_3, 1)
공간 분배 비율
버튼1 : 2
버튼2 : 1
버튼3 : 1
총합 = 4
F. 중첩 레이아웃
# [5] 최종 전체 수직 레이아웃
v_layout = QVBoxLayout()
v_layout.addLayout(h_layout_1)
v_layout.addLayout(h_layout_2)
self.setLayout(v_layout)
G. main.py 구현
# Widget.py
from PySide6.QtWidgets import QWidget, QLabel, QHBoxLayout, QVBoxLayout, QSizePolicy, QLineEdit, QPushButton
class Widget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("사이즈 정책(SizePolicy) 및 스트레치 학습")
# [1] SizePolicy 설정
# SizePolicy는 부모 창의 크기가 변할 때 위젯의 크기를 어떻게 조절할 것인지 결정하는 정책입니다.
label = QLabel("텍스트 입력: ")
line_edit = QLineEdit()
# 가로 방향은 가능한 한 늘어나고(Expanding), 세로 방향은 고정(Fixed)
line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
# [2] 첫 번째 가로 레이아웃 : 텍스트 + 입력창
h_layout_1 = QHBoxLayout()
h_layout_1.addWidget(label)
h_layout_1.addWidget(line_edit)
# [3] 버튼 3개 생성
button_1 = QPushButton("버튼1")
button_2 = QPushButton("버튼2")
button_3 = QPushButton("버튼3")
# [4] 스트레치 설정
# 버튼1은 stretch=2 → 2배 넓은 공간 차지
# 버튼2, 버튼3은 stretch=1 → 동일 비율로 차지
h_layout_2 = QHBoxLayout()
h_layout_2.addWidget(button_1, 2)
h_layout_2.addWidget(button_2, 1)
h_layout_2.addWidget(button_3, 1)
# [5] 최종 전체 수직 레이아웃
v_layout = QVBoxLayout()
v_layout.addLayout(h_layout_1)
v_layout.addLayout(h_layout_2)
self.setLayout(v_layout)
# main.py
from PySide6.QtWidgets import QApplication
from widget import Widget
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec())