Qt에서는 뷰(View)와 컨트롤러(Controller) 간의 구분이 모호합니다. Qt는 운영 체제를 통해 사용자로부터 입력 이벤트를 받아 위젯(컨트롤러)에 위임합니다. 그러나 위젯은 사용자에게 자신의 상태를 표시하기도 하므로 뷰(View)의 역할도 합니다. Qt에서는 뷰와 컨트롤러를 결합하여 모델/뷰컨트롤러(Model/ViewController) 아키텍처 또는 간단히 모델 뷰(Model Views)라고 부릅니다.
모델/뷰컨트롤러 아키텍처에서는 모델이 데이터 저장소와 뷰컨트롤러(ViewController) 간의 인터페이스 역할을 합니다. 모델은 데이터를 보유하고(또는 참조를 보유하고) 표준화된 API를 통해 이 데이터를 제공합니다. 뷰는 이 데이터를 소비하여 사용자에게 표시합니다. 여러 뷰가 동일한 데이터를 공유할 수 있으며, 이를 완전히 다른 방식으로 표시할 수 있습니다.
모델은 데이터 또는 데이터에 대한 참조를 저장하고 개별 레코드 또는 범위의 레코드, 관련 메타데이터 또는 표시 지침을 반환합니다. 뷰는 모델에서 데이터를 요청하고 반환된 내용을 위젯에 표시합니다.
#### 간단한 모델 뷰 - 할 일 목록
ModelViews를 실습하기 위해 간단한 데스크톱 할 일 목록을 구현합니다. 이 목록은 QListView, 새로운 항목을 입력하는 QLineEdit, 항목을 추가, 삭제 또는 완료로 표시하는 버튼들로 구성됩니다.
UI는 Qt Creator를 사용하여 설계되었으며 mainwindow.ui로 저장되었습니다. .ui 파일은 pyside6-uic 명령을 사용하여 Python 파일로 변환됩니다.
```bash
pyside6-uic mainwindow.ui -o mainwindow.py
```
변환된 mainwindow.py 파일은 다음과 같습니다:
```python
from PySide6.QtWidgets import QMainWindow, QListView, QLineEdit, QPushButton, QVBoxLayout, QWidget
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setWindowTitle("Todo List")
self.centralwidget = QWidget(MainWindow)
self.layout = QVBoxLayout(self.centralwidget)
self.listView = QListView(self.centralwidget)
self.layout.addWidget(self.listView)
self.lineEdit = QLineEdit(self.centralwidget)
self.layout.addWidget(self.lineEdit)
self.addButton = QPushButton("Add", self.centralwidget)
self.layout.addWidget(self.addButton)
self.deleteButton = QPushButton("Delete", self.centralwidget)
self.layout.addWidget(self.deleteButton)
self.completeButton = QPushButton("Complete", self.centralwidget)
self.layout.addWidget(self.completeButton)
MainWindow.setCentralWidget(self.centralwidget)
```
이제 변환된 UI 파일을 사용하여 모델 뷰 구조를 구현합니다.
```python
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialog, QMessageBox
from PySide6.QtCore import QStringListModel
from mainwindow import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.model = QStringListModel()
self.ui.listView.setModel(self.model)
self.ui.addButton.clicked.connect(self.add_item)
self.ui.deleteButton.clicked.connect(self.delete_item)
self.ui.completeButton.clicked.connect(self.complete_item)
def add_item(self):
text, ok = QInputDialog.getText(self, "Add Item", "Item:")
if ok and text:
current_items = self.model.stringList()
current_items.append(text)
self.model.setStringList(current_items)
def delete_item(self):
selected = self.ui.listView.selectedIndexes()
if selected:
index = selected[0]
del_items = self.model.stringList()
del_items.pop(index.row())
self.model.setStringList(del_items)
def complete_item(self):
selected = self.ui.listView.selectedIndexes()
if selected:
index = selected[0]
items = self.model.stringList()
items[index.row()] = items[index.row()] + " (Completed)"
self.model.setStringList(items)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
```
이 예제에서는 `QStringListModel`을 사용하여 할 일 목록을 관리합니다. 사용자가 입력한 항목은 `QInputDialog`를 통해 받아들이며, 모델에 추가됩니다. 사용자가 항목을 선택하고 삭제 버튼을 클릭하면 선택된 항목이 삭제됩니다. 완료 버튼을 클릭하면 선택된 항목이 완료된 것으로 표시됩니다.
### 결론
이 장에서는 Qt의 모델 뷰 아키텍처에 대해 알아보았습니다. 모델 뷰 아키텍처를 사용하여 데이터를 효율적으로 관리하고 여러 뷰에서 동일한 데이터를 사용할 수 있습니다. 실습 예제를 통해 `QStringListModel`을 사용하여 간단한 할 일 목록 애플리케이션을 구현해 보았습니다. 다음 장에서는 Qt의 더 고급 모델 뷰 기능을 살펴보겠습니다.
'PYTHON(파이썬) > PYSIDE6(GUI)' 카테고리의 다른 글
| PYSIDE6 데이터베이스 작업 (1) | 2024.10.24 |
|---|---|
| PYSIDE6 고급 모델 뷰 프로그래밍 (2) | 2024.10.24 |
| PYSIDE6 MVC 소개 (2) | 2024.10.24 |
| PYSIDE6 QT 스타일 시트(QSS) (0) | 2024.10.24 |
| PYSIDE6 아이콘 (1) | 2024.10.24 |