1. 실습 예제

더보기

A. 구현 목표

main.py
0.00MB
widget.py
0.00MB

 

 

  • 텍스트 입력창은 넓게 늘어남
  • 버튼1은 공간을 가장 많이 차지함(stretch=2 적용)
  • 버튼2, 버튼3은 동일한 크기

 

 

 

B. 파일 구조

  • widget.py
  • main.py
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())

 

 


 

 

H. 실습 예제에서 확인하기

  1. 창을 좌우로 늘리면 누가 가장 많이 늘어나는가?
    : 버튼1

  2. 입력창과 텍스트라벨은 세로 크기가 늘어나나요?
    :  X, Fixed 정책 때문입니다.

  3. 버튼2와 버튼3은 같은 크기인가요?
    : O, stretch=1이므로 동일합니다.

 

2. 추가 실습 과제 (1)

더보기

 

 

  1. 앱을 옆으로 늘렸을 때, 버튼3을 버튼1, 버튼2보다 크게 늘어나게 만들기

  2. 라벨과 입력창 사이에 간격 추가하기

  3. 입력창의 높이를 더 크게 늘리기


3. 추가 실습 과제 (2)

더보기

버튼을 클릭했을때, QLineEdit 위젯에 입력한 값을 터미널에 print( ) 함수로 출력하는 기능을 구현하세요.

# <추가 실습 과제>  QLineEdit 입력값 변수로 가져오는 방법
input_data = self.QLineEdit()객체변수명.text().strip()