• 티스토리 홈
  • 프로필사진
    소쩍소쩍이
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
소쩍소쩍이
  • 프로필사진
    소쩍소쩍이
    • 분류 전체보기 (51) N
      • 파이썬 (18)
        • 문제 및 예제 (8)
      • PySide6 (15) N
        • Signal & Slot (6)
        • Layout (8)
        • Model & View (1) N
      • 리눅스 (5)
      • 아두이노 (0)
      • 일지 (11)
  • GitHub
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • 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)

      login_hw.zip
      0.01MB


      이번 실습을 통해 Model과 View를 분리하여 프로그램을 구성하는 방법을 학습할 수 있었다.

      처음에는 각 화면에서 회원 정보를 개별적으로 관리하려고 했지만, 하나의 Model 객체를 여러 View가 공유하도록 구현하면서 데이터를 중앙에서 관리하는 방식이 훨씬 효율적이라는 것을 확인할 수 있었다.

      또한 객체를 다른 클래스에 전달하는 과정에서 AttributeError가 발생하기도 했지만, 이를 해결하면서 객체 참조와 클래스 간의 관계에 대해 더욱 이해할 수 있었다.

      특히 프로필 화면에서 회원 정보를 수정했을 때 메인 화면에도 변경 사항이 반영되는 기능을 구현하면서 하나의 데이터를 여러 화면이 공유하는 구조의 중요성을 체감할 수 있었다.

      다음글
      다음 글이 없습니다.
      이전글
      이전 글이 없습니다.
      댓글
    조회된 결과가 없습니다.
    스킨 업데이트 안내
    현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
    ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바