7.1 Model/View 구조

1. 학습 목표
2. 문제 파악
: 6.11 QScrollArea 예제에서 문제 파악
1. 지난 포스트(6.11 QScrollArea)에서 문제 확인
6.11 QScrollArea
다양한 스크롤 UI 위젯(QScrollArea, QListWidget, QTextEdit)을 사용해 보고,이를 하나의 창에서 QTabWidget 으로 탭 구조로 통합해 보기 1. QScrollArea더보기# tab_scroll_area.pyfrom PySide6.QtWidgets import ( QWidget, QVBoxLayo
basiclike.tistory.com
1.1 QScrollArea 기반 탭
라벨을 직접 content_layout.addWidget(label) 형태로 추가
→ 데이터가 GUI 위젯 안에 저장됨
→ 다른 View와 데이터 공유 불가
1.2 QListWidget 기반 탭
self.list_widget.addItem 데이터 ("항목")
→ 아이템 데이터는 QListWidget 내부에 별도의 ListModel로 저장됨
→ 다른 View와 데이터 공유 불가
1.3 QTextEdit 기반 탭
self.log_textedit.append("로그")
→ 텍스트는 QTextEdit 내부 문서(Document)에 바로 저장됨
→ 역시 다른 View와 데이터 공유 불가능
1.4 공통된 근본적 문제
다양한 스크롤 UI(View)는 결국 “표시 방식만 다를 뿐, 데이터는 동일할 수 있다”
QScrollArea, QListWidget, QTextEdit은 각각 자체적으로 데이터를 내부에 저장한다
→ 즉 “뷰(View)에 데이터가 저장되는 구조”
3. 문제 파악 을 위한 추가 예시
: Model - View 와 같은 아키텍처 패턴으로 구현하는 이유
3.1 공유 Data
User = {
"name": "홍길동",
"email": "hong@example.com",
"role": "관리자"
}
- 사용자가 로그인하면 다음과 같은 정보가 있다고 가정
3.2 여러 View
앱에는 다음과 같은 여러 화면(View)이 로그인한 사용자 정보를 표시해야 한다.
즉, 같은 데이터를 여러 View에서 공유해야 하는 상황.
- 메인 화면
- 설정 화면
- 프로필 화면
- 알림 화면
3.3 문제 구조
class MainView(QWidget):
def __init__(self, userInfo):
self.userInfo = userInfo # ← ← ← 각 화면마다 userInfo를 복사해서 들고 있는 구조
label.setText(f"{self.userInfo['name']} 님 환영합니다")
class ProfileView(QWidget):
def __init__(self, userInfo):
self.userInfo = userInfo # ← ← ← 각 화면마다 userInfo를 복사해서 들고 있는 구조
label.setText(self.userInfo['email'])
- 뷰(View)가 데이터(userInfo)를 직접 독립적으로 각각 저장하는 방식
- userInfo가 변경되면, 다른 View는 절대 알 수 없다
4. 해결 구조
4. 해결 구조
하나의 모델(Model)을 만들어 데이터 중앙 관리
view_1 ←── data # 데이터가 View에 종속
view_2 ←── data
view_3 ←── data
view_1 ←─┐
view_2 ←── model ←─ data # Model이 View에 종속
view_3 ←─┘
- 데이터(Model)를 따로 만들고
- 모든 View는 이 Model을 “보기만” 한다.