ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PYSIDE6 MVC 소개
    PYTHON(파이썬)/PYSIDE6(GUI) 2024. 10. 24. 06:44
    728x90
    반응형

    모델--컨트롤러(Model-View-Controller, MVC)는 사용자 인터페이스를 개발할 때 사용되는 아키텍처 패턴입니다. 이 패턴은 사용자 인터페이스, 이를 뒷받침하는 데이터, 제어 로직 간의 분리를 강조하며, 코드 유지 보수를 개선하는 것을 목표로 합니다.

     

    MVC 패턴은 인터페이스를 다음과 같은 구성 요소로 나눕니다:

     

    - **모델(Model)**: 애플리케이션이 다루는 데이터 구조를 보유합니다.

    - **(View)**: 사용자에게 표시되는 정보의 모든 표현입니다. 그래픽이나 테이블 등 여러 형태의 동일한 데이터 뷰를 허용합니다.

    - **컨트롤러(Controller)**: 사용자의 입력을 받아 이를 명령으로 변환하고 모델이나 뷰에 적용합니다.

     

    간단한 경우에는 이 디자인 패턴을 직접 구현할 수 있으며, 이 장에서는 이를 다루게 됩니다. 그러나 더 복잡한 Qt 위젯(: 테이블 또는 동적 리스트)을 사용할 때는 문제가 발생할 수 있습니다. 이를 위해 Qt ModelViews라는 내장 솔루션을 제공합니다.

     

    ModelViews는 표준 표시 위젯에 대한 강력한 대안으로, 데이터 소스와 상호 작용하기 위해 표준화된 모델 인터페이스를 사용합니다. 이로 인해 데이터를 임의의 구조로 유지할 수 있으며, 뷰는 프레젠테이션과 업데이트를 담당합니다.

     

    이 장에서는 간단한 사례를 먼저 살펴보고, 대화 상자를 관리하기 위해 자체적인 MVC 아키텍처를 구축한 다음, Qt ModelView 아키텍처를 사용하여 PySide6에서 간단한 데스크톱 할 일 목록 애플리케이션을 만드는 방법을 알아봅니다.

     

    ###  모델 뷰 컨트롤러

    모델--컨트롤러(MVC)는 사용자 인터페이스를 구현할 때 사용되는 소프트웨어 디자인 패턴입니다. 그렇다면 왜 아직 사용하지 않았을까요? 실제로 Qt로 많은 작업을 할 수 있기 때문입니다. Qt 애플리케이션을 작성하는 표준 접근 방식은 많은 컨트롤러 로직을 위젯에 넣고, UI(모델)의 상태를 위젯 자체를 통해 항상 사용할 수 있게 합니다. 이로 인해 많은 경우 MVC 분리를 강제하면 코드 유지 보수성이 오히려 떨어집니다.

     

    하지만 좋은 소식도 있습니다. Qt에서도 MVC의 장점을 누릴 수 있는 방법이 있습니다. 이 장에서는 지난 몇 년 동안 다양한 프로젝트에서 효과적으로 사용해 온 선호 방법을 안내합니다. 이 접근 방식은 효과적이지만 가볍습니다. Qt 코드에 이상한 부분을 강제하지 않으며 애플리케이션의 복잡성을 줄여줍니다.

     

    #### 아키텍처

    MVC의 장점은 UI, 데이터 및 제어 로직의 분리에서 비롯됩니다. 일반적인 Qt 애플리케이션에서는 데이터가 표시되는 위젯에 묶여 있습니다. 예를 들어, 텍스트 입력 lineedit의 텍스트 값은 lineedit.text()를 통해 사용할 수 있습니다. 이 값을 가져와 로직에서 사용해 본 적이 있을 것입니다. 하지만 이 경우 로직이 뷰에 접근해야 합니다. 이 연결을 끊기 위해 데이터를 다른 곳으로 이동해야 합니다.

     

    우리는 모델을 생성할 것입니다. 이 모델은 값이 업데이트될 때 Qt 신호를 방출하는 간단한 사전(dictionary)입니다. 이 신호는 UI를 업데이트하거나 동기화하는 데 사용됩니다. 마찬가지로 UI의 변경 사항도 모델을 업데이트하는 데 사용됩니다. 결과적으로 모델은 UI의 현재 상태를 항상 반영하지만 논리적으로는 분리됩니다.

     

    일반적으로 더 큰 애플리케이션에서는 여러 모델을 원하게 됩니다. 각 모델은 특정 항목과 관련된 데이터를 관리해야 합니다.

     

    컨트롤러의 구현은 더 유연합니다. Python 클래스를 사용하는 것이 좋지만 함수 모듈도 괜찮습니다. 컨트롤러는 모델의 데이터를 읽고 변환하며 업데이트하는 역할을 합니다. 업데이트는 다시 UI에 반영됩니다. 어떤 경우에는 모델과 컨트롤러를 단일 클래스로 병합하는 것이 의미가 있을 수 있습니다. 유지 보수성을 개선하는 데 집중해야 합니다.

     

    모델은 단일 진실 공급원이 되어야 합니다. 모델이 구현되면 모델 값을 동기화하기 위해서가 아닌 경우 위젯에서 직접 값을 쿼리하지 마십시오. 다른 코드는 모델 값을 직접 액세스해야 합니다.

     

    #### 구현

    이제 구현해 봅시다. 아래 예제에서는 몇 가지 기본 위젯과 비즈니스 로직을 트리거하는 데 사용할 수 있는 버튼이 포함된 간단한 UI를 만들었습니다. 위젯을 편집하면 표준 핸들러 메서드를 통해 모델이 업데이트됩니다. 현재 모델 자체는 단순한 사전(dictionary)에 불과하며, 이를 곧 개선할 것입니다.

     

    ```python

    import sys

    import random

    from PySide6.QtWidgets import (

        QApplication,

        QComboBox,

        QFormLayout,

        QLineEdit,

        QMainWindow,

        QSpinBox,

        QWidget,

        QPushButton,

    )

     

    # 모델은 처음에는 단순한 사전(dictionary)입니다.

    model = {

        "name": "Johnina Smith",

        "age": 10,

        "favorite_icecream": "Vanilla",

    }

     

    class MainWindow(QMainWindow):

        def __init__(self):

            super().__init__()

            self.setWindowTitle("My App")

            layout = QFormLayout()

     

            # 폼 데이터를 저장할 사전(dictionary)과 기본 데이터.

            self.name = QLineEdit()

            self.name.setText(model["name"])

            self.name.textChanged.connect(self.handle_name_changed)

            self.age = QSpinBox()

            self.age.setRange(0, 200)

            self.age.setValue(model["age"])

            self.age.valueChanged.connect(self.handle_age_changed)

            self.icecream = QComboBox()

            self.icecream.setObjectName("thecombo")

            self.icecream.addItems(["Vanilla", "Strawberry", "Chocolate"])

            self.icecream.setCurrentText(model["favorite_icecream"])

            self.icecream.currentTextChanged.connect(self.handle_icecream_changed)

     

            self.save_btn = QPushButton("Save")

            self.restore_btn = QPushButton("Restore")

     

            layout.addRow("Name", self.name)

            layout.addRow("Age", self.age)

            layout.addRow("Favorite Ice cream", self.icecream)

            layout.addRow(self.save_btn)

            layout.addRow(self.restore_btn)

     

            widget = QWidget()

            widget.setLayout(layout)

            self.setCentralWidget(widget)

     

        def handle_name_changed(self, name):

            model["name"] = name

            print(model)

     

        def handle_age_changed(self, age):

            model["age"] = age

            print(model)

     

        def handle_icecream_changed(self, icecream):

            model["favorite_icecream"] = icecream

            print(model)

     

    app = QApplication(sys.argv)

    window = MainWindow()

    window.show()

    app.exec()

    ```

     

    이 예제에서는 간단한 Python 사전(dictionary)을 사용하여 모델을 정의합니다. 위젯의 신호는 최신 값을 전달하는 핸들러에 연결되어 있습니다. 핸들러는 최신 값을 받아 모델에 저장합니다.

     

    다음 단계는 사용자 정의 신호를 방출하는 사용자 정의 사전(dictionary)을 만들어 모델이 업데이트될 때 자동으로 UI를 업데이트하거나 동기화하는 것입니다.

     

    728x90

    'PYTHON(파이썬) > PYSIDE6(GUI)' 카테고리의 다른 글

    PYSIDE6 고급 모델 뷰 프로그래밍  (2) 2024.10.24
    PYSIDE6 QT의 모델 뷰 아키텍처  (3) 2024.10.24
    PYSIDE6 QT 스타일 시트(QSS)  (0) 2024.10.24
    PYSIDE6 아이콘  (0) 2024.10.24
    PYSIDE6 팔레트  (0) 2024.10.24
Designed by Tistory.