학습 로그/Python3

D+35 [Layout] 레이아웃 종합 예제 학습(1)

goodjop79 님의 블로그 2026. 5. 27. 18:43

ㅇ 일자  : 2026년 5월 27일(수) 

 

ㅇ 내용 : Layout 가상환경에서 종합 예제 학습 하기

 

(예제 1)  사이즈 정책  실습 

※ main.py 실행하면 윈도우위젯 화면에서 버튼이 출력되고, 텍스트를 입력할 수 있다. 

# main.py 실행부 파일이다.

from PySide6.QtWidgets import QApplication
from widget import SizePolicyExample
import sys

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = SizePolicyExample()
    w.show()
    sys.exit(app.exec())
# widget.py 레이아웃 종합 예제 실습하기

from PySide6.QtWidgets import QWidget, QLabel, QHBoxLayout, QVBoxLayout, QSizePolicy, QLineEdit, QPushButton

class SizePolicyExample(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)

 

 

(예제 2)  창의 좌우 마우스로 늘려서 가장 많이 늘어나는 사이즈 

※  버튼 1이 가장 크기가 크고 나머지는 동일하다. 값을 수정해 주면 된다. 1,1,1,  ----> 2,1,1

    h_layout_2.addWidget(button_1, 2)
    h_layout_2.addWidget(button_2, 1)
    h_layout_2.addWidget(button_3, 1)

 

※ 버튼 1은 크고, 버튼 2, 3번은 크기가 동일한 크기로 조정 (stretch)  stretch 값 수정 

# widget.py 레이아웃 종합 예제 실습하기

from PySide6.QtWidgets import QWidget, QLabel, QHBoxLayout, QVBoxLayout, QSizePolicy, QLineEdit, QPushButton

class SizePolicyExample(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)

 

(예제 2-2) stretch 값을 버튼 3에 많이 주고 나머지는 작은 값을 주어 크기를 조절한다.

※  버튼1이 가장 크기가 크고 나머지는 동일하다. 값을 수정해 주면 된다. 1,1,1,  ----> 1,1,2

        # [4] 레이아웃 설정 (비율)
        # 버튼3의 stretch 비율을 2로 하여 버튼1,2보다 2배 넓게 차지하도록 설정
        h_layout_2 = QHBoxLayout()
        h_layout_2.addWidget(button_1, 1)
        h_layout_2.addWidget(button_2, 1)
        h_layout_2.addWidget(button_3, 2)

        # [5] 전체 메인 레이아웃 구성
        v_layout = QVBoxLayout()
        v_layout.addLayout(h_layout_1)
        v_layout.addLayout(h_layout_2)
        
        self.setLayout(v_layout)

 

 

(예제 2-3) 사이즈 정책에서 스트레치 값을 조정하여 크기 조절

※ line_edit를 한줄 더 추가해서 텍스트 입력창의 행을 늘려준다.

# 텍스트 입력창에 라인에디트 한줄을 더 추가하여 입력 행을 늘려 준다.
# [2] 첫 번째 가로 레이아웃 : 텍스트 + 입력창
        h_layout_1 = QHBoxLayout()
        h_layout_1.addWidget(label)
        h_layout_1.addWidget(line_edit)
        h_layout_1.addWidget(line_edit)

 

    

(예제 2-4) 입력창 높이를 더 크게 늘리기 

※ 복합 레이아웃 적용 : 텍스트 입력창 크기, 버튼 3번 크게 하기, 전체적인 창크기 고정 아닌 가능한 늘어나게 하기 (수정한 부분)

        # 수정한 부분 / 로컬 변수 대신 self.line_edit로 선언 (인스턴스 변수화)
        self.input_field.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)


        # 가로 방향은 가능한 한 늘어나고(Expanding), 세로 방향은 고정(Fixed)
        line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)

        # 수정한 부분 [2] 첫 번째 가로 레이아웃 : 텍스트 + 입력창
        h_layout_1 = QHBoxLayout()
        h_layout_1.addWidget(label)
        h_layout_1.addWidget(line_edit)
        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, 1)
        h_layout_2.addWidget(button_2, 1)
        h_layout_2.addWidget(button_3, 2)  # 수정한 부분

 

 

(예제 2-5) 라벨과 입력창 사이 간격을 추가하기

※ 텍스트 입력창과 글자 입력창이 조화롭지 않게 보인다. 좀더 보기 좋은 화면을 위해서는 버튼3 크기와 텍스트 입력창 크기를 조절해 줘야 한다.

 

 

(예제 2-6) 버튼을 클릭했을 때 QLineEdit 위젯에 입력한 값 터미널 화면에 출력하기

<수정전 초기>  문제점 : 코드 수정을 달리하여  main.py 화면창만 만들어 졌다.

                      self.setWindowTitle ("위젯 크기 정책(SizePolicy)") 이 main.py가 되었다.

 

<구문 수정 후> 버튼을 클릭했을 때 QLineEdit 위젯에 입력한 값이 터미널 화면에 출력되도록 수정되었다.

    def init_ui(self):
        self.setWindowTitle("QLineEdit 입력값 출력")

from PySide6.QtWidgets import QWidget, QVBoxLayout, QLineEdit, QPushButton

class MyWidget(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("QLineEdit 입력값 출력")
        self.resize(300, 150)
        # 레이아웃 생성
        layout = QVBoxLayout()
#### 버튼을 클릭했을 때 QLineEdit 위젯에 입력한 값 터미널화면에 출력하기
        # QLineEdit 생성
        self.input_line_edit = QLineEdit(self)
        self.input_line_edit.setPlaceholderText("텍스트를 입력하세요.")

        # QPushButton 생성
        self.print_btn = QPushButton("터미널에 출력", self)
        self.print_btn.clicked.connect(self.print_input_value)

        # 레이아웃에 위젯 추가
        layout.addWidget(self.input_line_edit)
        layout.addWidget(self.print_btn)
        self.setLayout(layout)

    def print_input_value(self):
        # QLineEdit 입력값 변수로 가져오는 방법
        input_data = self.input_line_edit.text().strip()

        # 터미널에 출력
        print(f"입력된 값: {input_data}")