- Model / View 구조구현2026년 06월 01일
- 소쩍소쩍이
- 작성자
- 2026.06.01.:32

main.py
import sys from PySide6.QtWidgets import QApplication from model import MemberModel from widget import MainWidget if __name__ == "__main__": app = QApplication(sys.argv) member_model = MemberModel() window = MainWidget(member_model) window.show() sys.exit(app.exec())model.py
from PySide6.QtCore import QObject, Signal class MemberModel(QObject): change_data = Signal() def __init__(self): super().__init__() self.id = "test" self.pw = "1234" self.name = "홍길동" self.email = "test@test.com" self.phone = "010-1234-5678" def user_data_update(self, new_data): self.user_data = new_data self.change_data.emit(self.user_data)login.py
from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QLabel, QPushButton, QHBoxLayout, QLineEdit ) class LoginView(QWidget): def __init__(self, member_model,tab_widget, main_view, profile_view): super().__init__() self.member_model = member_model self.tab_widget = tab_widget self.main_view = main_view self.profile_view = profile_view self.label_id = QLabel("ID") self.line_edit_id = QLineEdit() self.line_edit_id.setPlaceholderText("아이디를 입력하세요") self.label_pw = QLabel("PW") self.line_edit_pw = QLineEdit() self.line_edit_pw.setPlaceholderText("비밀번호를 입력하세요") self.login_button = QPushButton("로그인") self.login_button.clicked.connect(self.login) self.result_label = QLabel() self.layout = QVBoxLayout() self.layout.addWidget(self.label_id) self.layout.addWidget(self.line_edit_id) self.layout.addWidget(self.label_pw) self.layout.addWidget(self.line_edit_pw) self.layout.addWidget(self.login_button) self.layout.addWidget(self.result_label) self.setLayout(self.layout) def login(self): input_id = self.line_edit_id.text() input_pw = self.line_edit_pw.text() if (input_id == self.member_model.id and input_pw == self.member_model.pw): self.result_label.setText("로그인 성공") self.main_view.update_view() self.profile_view.load_profile() self.tab_widget.setCurrentIndex(1) else: self.result_label.setText("로그인 실패")profile.py
from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QLabel, QPushButton, QHBoxLayout, QLineEdit ) class ProfileView(QWidget): def __init__(self, member_model, main_view): super().__init__() self.member_model = member_model self.main_view = main_view self.label_id = QLabel() self.line_edit_name = QLineEdit() self.line_edit_email = QLineEdit() self.line_edit_phone = QLineEdit() self.button_update = QPushButton("수정하기") self.button_update.clicked.connect(self.update_profile) layout = QVBoxLayout() layout.addWidget(QLabel("ID")) layout.addWidget(self.label_id) layout.addWidget(QLabel("이름")) layout.addWidget(self.line_edit_name) layout.addWidget(QLabel("이메일")) layout.addWidget(self.line_edit_email) layout.addWidget(QLabel("전화번호")) layout.addWidget(self.line_edit_phone) layout.addWidget(self.button_update) self.setLayout(layout) def load_profile(self): self.label_id.setText(f"{self.member_model.id}") self.line_edit_name.setText(self.member_model.name) self.line_edit_email.setText(self.member_model.email) self.line_edit_phone.setText(self.member_model.phone) def update_profile(self): self.member_model.name = self.line_edit_name.text() self.member_model.email = self.line_edit_email.text() self.member_model.phone = self.line_edit_phone.text() self.main_view.update_view()views.py
from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QLabel, QPushButton, QHBoxLayout, QLineEdit ) class MainView(QWidget): def __init__(self, member_model): super().__init__() self.member_model = member_model self.label_id = QLabel() self.label_name = QLabel() self.label_email = QLabel() self.label_phone = QLabel() layout = QVBoxLayout() layout.addWidget(self.label_id) layout.addWidget(self.label_name) layout.addWidget(self.label_email) layout.addWidget(self.label_phone) self.setLayout(layout) def update_view(self): self.label_id.setText(f"아이디 : {self.member_model.id}") self.label_name.setText(f"이름 : {self.member_model.name}") self.label_email.setText(f"이메일 : {self.member_model.email}") self.label_phone.setText(f"전화번호 : {self.member_model.phone}")widget.py
from PySide6.QtWidgets import QWidget, QVBoxLayout, QTabWidget from login import LoginView from profile import ProfileView from views import MainView class MainWidget(QWidget): def __init__(self, member_model): super().__init__() self.member_model = member_model self.tap_widget = QTabWidget() self.main_view = MainView(member_model) self.profile_view = ProfileView(member_model, self.main_view) self.login_view = LoginView(member_model, self.tap_widget, self.main_view, self.profile_view ) self.tap_widget.addTab(self.login_view, "로그인") self.tap_widget.addTab(self.main_view, "메인화면") self.tap_widget.addTab(self.profile_view, "프로필") layout = QVBoxLayout() layout.addWidget(self.tap_widget) self.setLayout(layout)
이번 실습을 통해 Model과 View를 분리하여 프로그램을 구성하는 방법을 학습할 수 있었다.
처음에는 각 화면에서 회원 정보를 개별적으로 관리하려고 했지만, 하나의 Model 객체를 여러 View가 공유하도록 구현하면서 데이터를 중앙에서 관리하는 방식이 훨씬 효율적이라는 것을 확인할 수 있었다.
또한 객체를 다른 클래스에 전달하는 과정에서 AttributeError가 발생하기도 했지만, 이를 해결하면서 객체 참조와 클래스 간의 관계에 대해 더욱 이해할 수 있었다.
특히 프로필 화면에서 회원 정보를 수정했을 때 메인 화면에도 변경 사항이 반영되는 기능을 구현하면서 하나의 데이터를 여러 화면이 공유하는 구조의 중요성을 체감할 수 있었다.
다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)