8강. 레이아웃 종합 예제

1. 실습 예제
A. 구현 목표


- 텍스트 입력창은 넓게 늘어남
- 버튼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 - 입력창과 텍스트라벨은 세로 크기가 늘어나나요?
: X, Fixed 정책 때문입니다. - 버튼2와 버튼3은 같은 크기인가요?
: O, stretch=1이므로 동일합니다.
2. 추가 실습 과제 (1)

- 앱을 옆으로 늘렸을 때, 버튼3을 버튼1, 버튼2보다 크게 늘어나게 만들기
- 라벨과 입력창 사이에 간격 추가하기
- 입력창의 높이를 더 크게 늘리기
3. 추가 실습 과제 (2)
버튼을 클릭했을때, QLineEdit 위젯에 입력한 값을 터미널에 print( ) 함수로 출력하는 기능을 구현하세요.
# <추가 실습 과제> QLineEdit 입력값 변수로 가져오는 방법
input_data = self.QLineEdit()객체변수명.text().strip()
0. 학습 목표
이번 4.8 단계에서는 지금까지 배운 PySide6 레이아웃 개념을 종합하여 하나의 예제 화면을 만들어 봅니다.
이번 예제에서는 QHBoxLayout, QVBoxLayout, SizePolicy, Stretch, QLineEdit, QPushButton을 함께 사용합니다.
단순히 위젯을 배치하는 것에서 끝나는 것이 아니라, 창 크기가 변할 때 어떤 위젯이 어떻게 늘어나는지도 함께 확인합니다.
| 학습 목표 | 내용 |
| 파일 분리 구조 이해 | main.py와 widget.py로 실행 코드와 화면 코드를 분리하는 구조를 이해합니다. |
| SizePolicy 적용 이해 | QLineEdit과 QLabel에 SizePolicy를 적용하여 가로/세로 크기 변경 방식을 이해합니다. |
| Stretch 적용 이해 | 버튼 3개의 공간 배분 비율을 stretch 값으로 조절하는 방법을 이해합니다. |
| 중첩 레이아웃 이해 | 두 개의 QHBoxLayout을 QVBoxLayout 안에 넣어 화면을 구성하는 구조를 이해합니다. |
| 입력값 가져오기 이해 | QLineEdit에 입력한 값을 버튼 클릭 시 text().strip()으로 가져오는 방법을 이해합니다. |
이번 단계의 핵심
레이아웃 종합 예제는 단순히 위젯을 올려놓는 실습이 아닙니다.
화면 구조 분리, 가로/세로 레이아웃 조합, SizePolicy, Stretch, 입력값 처리까지 함께 확인하는 종합 실습입니다.
1. 실습 예제 개요
1.1 구현 목표
이번 예제에서는 텍스트 입력창과 버튼 3개를 가진 간단한 화면을 만듭니다.
화면은 크게 두 줄로 구성됩니다.
| 영역 | 구성 |
| 첫 번째 줄 | QLabel + QLineEdit을 가로로 배치합니다. |
| 두 번째 줄 | 버튼1, 버튼2, 버튼3을 가로로 배치합니다. |
| 전체 구조 | 두 개의 가로 레이아웃을 세로 레이아웃 안에 넣습니다. |
실행 결과에서 확인할 핵심은 다음과 같습니다.


┌──────────────────────────────────────────────┐
│ 텍스트 입력: [ 입력창이 가로로 넓게 늘어남 ] │
│ │
│ [ 버튼1 ] [ 버튼2 ] [ 버튼3 ] │
└──────────────────────────────────────────────┘
확인할 결과
텍스트 입력창은 가로로 넓게 늘어납니다.
버튼1은 stretch=2가 적용되어 버튼2, 버튼3보다 더 넓은 공간을 차지합니다.
버튼2와 버튼3은 stretch=1이므로 동일한 비율로 배치됩니다.
1.2 파일 구조
이번 예제는 파일을 두 개로 나누어 작성합니다.

프로젝트 폴더
├── main.py
└── widget.py
| 파일 | 역할 |
| widget.py | 화면에 표시될 Widget 클래스를 정의합니다. |
| main.py | QApplication을 만들고 Widget을 실행합니다. |
주의
파일 이름은 widget.py처럼 소문자로 저장합니다.
main.py에서 from widget import Widget으로 가져오기 때문입니다.
2. widget.py 구현
2.1 widget.py 전체 코드
from PySide6.QtWidgets import (
QWidget, QLabel, QHBoxLayout, QVBoxLayout,
QSizePolicy, QLineEdit, QPushButton
)
class Widget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("사이즈 정책(SizePolicy) 및 스트레치 학습")
self.resize(420, 140)
# [1] SizePolicy 설정
# SizePolicy는 부모 창의 크기가 변할 때 위젯의 크기를 어떻게 조절할 것인지 결정하는 정책입니다.
label = QLabel("텍스트 입력: ")
self.line_edit = QLineEdit()
# 가로 방향은 가능한 한 늘어나고(Expanding), 세로 방향은 고정(Fixed)
self.line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
# [2] 첫 번째 가로 레이아웃 : 텍스트 + 입력창
h_layout_1 = QHBoxLayout()
h_layout_1.addWidget(label)
h_layout_1.addWidget(self.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)
이 파일은 화면에 표시될 Widget 클래스를 정의합니다.
Widget 클래스 안에서 라벨, 입력창, 버튼, 가로 레이아웃, 세로 레이아웃을 모두 구성합니다.
2.2 코드 구조 흐름
QLabel + QLineEdit 생성
↓
SizePolicy 설정
↓
첫 번째 QHBoxLayout에 라벨과 입력창 추가
↓
QPushButton 3개 생성
↓
두 번째 QHBoxLayout에 버튼 3개 추가 + stretch 설정
↓
QVBoxLayout에 두 개의 QHBoxLayout 추가
↓
self.setLayout(v_layout)으로 전체 레이아웃 적용
중요한 점
이번 예제는 QHBoxLayout 두 개를 만든 뒤, QVBoxLayout 안에 넣는 중첩 레이아웃 구조입니다.
즉, 가로 배치 구조 두 개를 세로 방향으로 쌓아 올리는 방식입니다.
3. SizePolicy 적용 이해
3.1 SizePolicy란?
SizePolicy는 창의 크기가 늘어나거나 줄어들 때 위젯이 어떤 방식으로 변화할지 결정하는 규칙입니다.
즉, 레이아웃이 공간을 배분할 때 위젯이 그 공간을 받아들일 준비가 되어 있는지 알려주는 설정입니다.
| 옵션 | 의미 |
| Fixed | 크기를 고정합니다. 가능한 한 크기가 변하지 않습니다. |
| Expanding | 가능하면 주어진 공간을 받아 넓게 늘어납니다. |
| Minimum | 최소 크기만 유지하고, 필요한 경우 공간을 받을 수 있습니다. |
| Preferred | 선호 크기를 유지하되, 필요하면 늘어날 수 있습니다. |
3.2 코드에서 적용된 부분
label = QLabel("텍스트 입력: ")
self.line_edit = QLineEdit()
self.line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

입력창인 QLineEdit에는 가로 방향 Expanding, 세로 방향 Fixed를 적용했습니다.
라벨은 설명 텍스트이므로 가로와 세로 모두 Fixed로 두어 크기가 불필요하게 커지지 않도록 했습니다.
| 위젯 | SizePolicy | 결과 |
| QLineEdit | Expanding / Fixed | 가로로는 늘어나고, 세로 높이는 유지됩니다. |
| QLabel | Fixed / Fixed | 라벨 크기는 가능한 한 고정됩니다. |
중요한 점
입력창은 사용자가 입력할 공간이 필요하므로 가로 방향으로 넓게 늘어나는 것이 자연스럽습니다.
반면 라벨은 설명 텍스트이므로 입력창처럼 넓게 늘어날 필요가 없습니다.
4. HBoxLayout에 가로 배치하기
4.1 첫 번째 가로 레이아웃
첫 번째 줄은 라벨과 입력창을 가로 방향으로 배치합니다.
h_layout_1 = QHBoxLayout()
h_layout_1.addWidget(label)
h_layout_1.addWidget(self.line_edit)

QHBoxLayout은 위젯을 왼쪽에서 오른쪽 방향으로 배치합니다.
따라서 label이 왼쪽에 오고, self.line_edit이 오른쪽에 배치됩니다.
h_layout_1
[ 텍스트 입력: ] [ QLineEdit 입력창 ]
4.2 입력창이 넓게 늘어나는 이유
창을 좌우로 넓히면 입력창은 가로로 늘어납니다.
그 이유는 QLineEdit에 다음 SizePolicy를 적용했기 때문입니다.
self.line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
정리
QLineEdit의 가로 방향 정책은 Expanding입니다.
따라서 레이아웃 안에서 남는 가로 공간을 받아 넓어질 수 있습니다.
5. Stretch 적용 이해
5.1 Stretch란?
Stretch는 레이아웃 안에 남는 공간을 비율로 어떻게 나눌지 결정하는 값입니다.
위젯의 절대 크기를 직접 지정하는 것이 아니라, 레이아웃 안에서 상대적으로 얼마나 더 많은 공간을 차지할지를 정합니다.
Stretch
↓
레이아웃 안의 남는 공간
↓
위젯별 비율로 분배
↓
버튼1 : 버튼2 : 버튼3 = 2 : 1 : 1
5.2 코드에서 적용된 부분
button_1 = QPushButton("버튼1")
button_2 = QPushButton("버튼2")
button_3 = QPushButton("버튼3")
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)

두 번째 가로 레이아웃에는 버튼 3개가 들어갑니다.
각 버튼은 stretch 값에 따라 공간을 나누어 가집니다.
| 버튼 | stretch 값 | 의미 |
| 버튼1 | 2 | 버튼2, 버튼3보다 더 많은 공간을 차지합니다. |
| 버튼2 | 1 | 기본 비율만큼 공간을 차지합니다. |
| 버튼3 | 1 | 버튼2와 동일한 비율로 공간을 차지합니다. |
공간 분배 비율
버튼1 : 버튼2 : 버튼3
2 : 1 : 1
총합 = 4
중요한 점
버튼1은 stretch=2이므로 버튼2, 버튼3보다 더 넓은 영역을 차지합니다.
버튼2와 버튼3은 stretch=1로 같기 때문에 서로 같은 비율로 배치됩니다.
6. 중첩 레이아웃 구성
6.1 최종 전체 수직 레이아웃
첫 번째 가로 레이아웃과 두 번째 가로 레이아웃을 만든 뒤, 마지막으로 전체 세로 레이아웃에 넣습니다.
v_layout = QVBoxLayout()
v_layout.addLayout(h_layout_1)
v_layout.addLayout(h_layout_2)
self.setLayout(v_layout)

h_layout_1과 h_layout_2는 위젯이 아니라 레이아웃입니다.
따라서 addWidget()이 아니라 addLayout()으로 추가합니다.
Widget(QWidget)
└── v_layout : QVBoxLayout
├── h_layout_1 : QHBoxLayout
│ ├── QLabel("텍스트 입력: ")
│ └── QLineEdit()
└── h_layout_2 : QHBoxLayout
├── QPushButton("버튼1") stretch=2
├── QPushButton("버튼2") stretch=1
└── QPushButton("버튼3") stretch=1
정리
이번 예제는 QVBoxLayout 안에 QHBoxLayout 두 개가 들어간 구조입니다.
전체는 위에서 아래로 쌓이고, 각 줄 내부는 왼쪽에서 오른쪽으로 배치됩니다.
7. main.py 구현
7.1 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())

main.py는 프로그램 실행을 담당하는 파일입니다.
widget.py에서 만든 Widget 클래스를 가져와 화면에 표시합니다.
7.2 실행 흐름
main.py 실행
↓
QApplication 생성
↓
Widget 객체 생성
↓
Widget 안에서 레이아웃 구성
↓
w.show()로 화면 표시
↓
app.exec()로 이벤트 루프 실행
중요한 점
main.py에는 화면 구성 코드가 거의 없습니다.
화면 구성은 widget.py의 Widget 클래스가 담당하고, main.py는 실행만 담당합니다.
8. 실습 예제에서 확인하기
8.1 실행 후 관찰할 내용
프로그램을 실행한 뒤 창을 좌우로 늘려 보면서 다음 내용을 확인합니다.
| 질문 | 답 | 이유 |
| 창을 좌우로 늘리면 누가 가장 많이 늘어나는가? | 버튼1 | 버튼1에 stretch=2가 적용되어 있기 때문입니다. |
| 입력창과 텍스트 라벨은 세로 크기가 늘어나는가? | 아니요 | 세로 방향 SizePolicy가 Fixed이기 때문입니다. |
| 버튼2와 버튼3은 같은 크기인가? | 예 | 둘 다 stretch=1이므로 같은 비율을 갖습니다. |
| 입력창은 가로로 넓게 늘어나는가? | 예 | QLineEdit의 가로 방향 SizePolicy가 Expanding이기 때문입니다. |
8.2 실습 확인 흐름
1. main.py를 실행한다.
2. 창을 좌우로 늘린다.
3. QLineEdit 입력창이 가로로 늘어나는지 확인한다.
4. 버튼1이 버튼2, 버튼3보다 넓은지 확인한다.
5. 버튼2와 버튼3의 크기가 같은지 확인한다.
6. 창을 세로로 늘렸을 때 입력창 높이가 크게 변하지 않는지 확인한다.
정리
이번 예제의 핵심은 창 크기 변경에 따른 반응을 관찰하는 것입니다.
레이아웃은 위젯을 배치할 뿐 아니라, 창 크기가 변할 때 위젯 크기를 어떻게 조절할지도 함께 관리합니다.
9. 추가 실습 과제
9.1 추가 실습 과제 1
다음 요구사항을 직접 수정해 봅니다.

| 과제 | 수정 방향 |
| 버튼3을 가장 크게 만들기 | button_3의 stretch 값을 button_1, button_2보다 크게 설정합니다. |
| 라벨과 입력창 사이에 간격 추가하기 | h_layout_1.addSpacing(값)을 사용하거나 레이아웃 간격을 조절합니다. |
| 입력창의 높이를 더 크게 늘리기 | QLineEdit의 세로 SizePolicy를 Fixed에서 Preferred 또는 Expanding으로 변경해 봅니다. |
예시 1: 버튼3을 가장 크게 만들기
h_layout_2.addWidget(button_1, 1)
h_layout_2.addWidget(button_2, 1)
h_layout_2.addWidget(button_3, 3)
이렇게 수정하면 버튼3이 버튼1, 버튼2보다 더 큰 비율로 공간을 차지합니다.
예시 2: 라벨과 입력창 사이에 간격 추가하기
h_layout_1.addWidget(label)
h_layout_1.addSpacing(20)
h_layout_1.addWidget(self.line_edit)
addSpacing(20)은 라벨과 입력창 사이에 20px 정도의 고정 간격을 추가합니다.
예시 3: 입력창의 높이를 더 크게 늘리기
self.line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
세로 방향 정책을 Fixed에서 Preferred로 바꾸면, 상황에 따라 입력창 높이가 더 유연하게 조정될 수 있습니다.
9.2 추가 실습 과제 2
이번에는 버튼을 클릭했을 때, QLineEdit 위젯에 입력한 값을 터미널에 print() 함수로 출력하는 기능을 구현합니다.
핵심 코드
QLineEdit 입력값은 다음처럼 가져올 수 있습니다.
input_data = self.line_edit.text().strip()
여기서 self.line_edit은 QLineEdit 객체 변수입니다.
수정 예시 코드
from PySide6.QtWidgets import (
QWidget, QLabel, QHBoxLayout, QVBoxLayout,
QSizePolicy, QLineEdit, QPushButton
)
class Widget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("사이즈 정책(SizePolicy) 및 스트레치 학습")
self.resize(420, 140)
label = QLabel("텍스트 입력: ")
self.line_edit = QLineEdit()
self.line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
h_layout_1 = QHBoxLayout()
h_layout_1.addWidget(label)
h_layout_1.addWidget(self.line_edit)
button_1 = QPushButton("버튼1")
button_2 = QPushButton("버튼2")
button_3 = QPushButton("버튼3")
button_1.clicked.connect(self.print_input_data)
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)
v_layout = QVBoxLayout()
v_layout.addLayout(h_layout_1)
v_layout.addLayout(h_layout_2)
self.setLayout(v_layout)
def print_input_data(self):
input_data = self.line_edit.text().strip()
print(input_data)
위 코드에서는 버튼1을 클릭하면 print_input_data() 메서드가 실행됩니다.
그리고 self.line_edit.text().strip()을 사용해 입력창의 값을 가져온 뒤 터미널에 출력합니다.
정리
QLineEdit 객체에서 입력값을 가져올 때는 객체 변수에 접근한 뒤 text()를 호출합니다.
앞뒤 공백을 제거하려면 strip()을 함께 사용합니다.
10. 정리
이번 단계에서는 PySide6 레이아웃을 종합적으로 사용하는 예제를 살펴보았습니다.
QHBoxLayout, QVBoxLayout, SizePolicy, Stretch를 함께 사용하면 창 크기 변화에 자연스럽게 반응하는 화면을 만들 수 있습니다.
widget.py
↓
화면 구성 담당
main.py
↓
프로그램 실행 담당
QHBoxLayout
↓
한 줄 안에서 가로 배치
QVBoxLayout
↓
여러 줄을 세로로 배치
SizePolicy
↓
위젯이 어느 방향으로 늘어날 수 있는지 결정
Stretch
↓
남는 공간을 어떤 비율로 나눌지 결정
| 개념 | 정리 |
| widget.py | 화면 UI를 구성하는 Widget 클래스를 정의합니다. |
| main.py | QApplication을 만들고 Widget을 실행합니다. |
| QHBoxLayout | 위젯을 가로 방향으로 배치합니다. |
| QVBoxLayout | 가로 레이아웃 두 개를 위에서 아래로 쌓습니다. |
| SizePolicy | 입력창이 가로로 늘어나고 세로 높이는 유지되도록 설정합니다. |
| Stretch | 버튼1이 버튼2, 버튼3보다 더 넓은 공간을 차지하도록 설정합니다. |
| QLineEdit.text() | 입력창에 입력한 문자열을 가져옵니다. |
이번 단계에서 기억할 문장
레이아웃 종합 예제는 단순 배치가 아니라, 창 크기 변화에 따라 위젯이 어떻게 반응하는지 확인하는 실습입니다.
SizePolicy는 위젯의 크기 변경 성향을 정하고, Stretch는 레이아웃 안의 공간 배분 비율을 정합니다.
참고. 공식 문서로 확인하기
이번 예제에서 사용한 QHBoxLayout, QVBoxLayout, QSizePolicy, QLineEdit, QPushButton, Layout Management는 Qt for Python 공식 문서에서 확인할 수 있습니다.
1. 공식 문서 참고 표
| 구분 | 공식 문서 | 확인할 내용 |
| QHBoxLayout / QVBoxLayout | PySide6.QtWidgets.QBoxLayout | QHBoxLayout과 QVBoxLayout이 QBoxLayout 계열이며 stretch 값을 사용할 수 있음을 확인할 수 있습니다. |
| QSizePolicy | PySide6.QtWidgets.QSizePolicy | 위젯이 가로/세로 방향으로 크기 변경을 어떻게 받아들이는지 확인할 수 있습니다. |
| QLineEdit | PySide6.QtWidgets.QLineEdit | 한 줄 입력 위젯과 text() 메서드 관련 내용을 확인할 수 있습니다. |
| QPushButton | PySide6.QtWidgets.QPushButton | 클릭 가능한 버튼 위젯과 clicked 신호를 확인할 수 있습니다. |
| Layout Management | Qt for Python - Layout Management | 레이아웃이 위젯의 sizeHint와 sizePolicy를 참고해 공간을 배분하는 구조를 확인할 수 있습니다. |
2. 공식 문서와 개념 연결
공식 문서 기준으로 보면, Qt 레이아웃은 위젯의 크기 요구사항과 sizePolicy를 참고하여 사용 가능한 공간을 배분합니다.
이번 예제에서 QLineEdit이 가로로 늘어나고, 버튼1이 더 넓은 공간을 차지하는 이유도 이 레이아웃 계산 구조와 연결됩니다.
QLayout
↓
위젯의 sizePolicy 확인
↓
레이아웃의 stretch 값 확인
↓
사용 가능한 공간 계산
↓
위젯 크기와 위치 자동 조정
3. 이번 예제와 공식 문서 연결
| 이번 예제 코드 | 공식 문서와 연결되는 의미 |
| self.line_edit.setSizePolicy(...) | 입력창이 가로/세로 방향으로 어떻게 크기 변경을 받아들일지 설정합니다. |
| h_layout_1 = QHBoxLayout() | 라벨과 입력창을 가로 방향으로 배치합니다. |
| h_layout_2.addWidget(button_1, 2) | 버튼1에 stretch=2를 적용하여 더 많은 공간을 차지하게 합니다. |
| v_layout.addLayout(h_layout_1) | 가로 레이아웃을 세로 레이아웃 안에 넣어 중첩 레이아웃을 만듭니다. |
| self.line_edit.text().strip() | 입력창의 문자열을 가져오고 앞뒤 공백을 제거합니다. |
4. 정리 흐름도
공식 문서 기준으로 정리하면 다음과 같습니다.
QWidget
↓
QLabel + QLineEdit 생성
↓
SizePolicy 설정
↓
QHBoxLayout으로 첫 번째 줄 구성
↓
QPushButton 3개 생성
↓
Stretch 값을 적용해 두 번째 줄 구성
↓
QVBoxLayout에 두 줄을 세로로 배치
↓
창 크기 변화에 반응하는 UI 완성
즉, 이번 종합 예제는 PySide6 레이아웃의 기본 배치와 공간 조절 개념을 함께 확인하는 실습입니다.