ㅇ 일자 : 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}")
'학습 로그 > Python3' 카테고리의 다른 글
| D+36 [Layout] .py 파일분리 왜 할까 ? 레이아웃 종합 예제 학습(2) (0) | 2026.05.28 |
|---|---|
| D+32 [Qt for Python] Designer 적용 구조 및 Layout 이해 (0) | 2026.05.21 |
| D+28 [PyQt] Qt Creator 활용 및 class 이해 (0) | 2026.05.16 |
| D+24 [Python3] Team Project(kiosk) 리뷰 (0) | 2026.05.11 |
| D+23 [PyCharm PySide6] 실습 및 주석 활용 (0) | 2026.05.11 |