이 장에서는 모델 뷰 프로그래밍의 고급 기능을 다룹니다. 이를 통해 더욱 복잡하고 강력한 애플리케이션을 개발할 수 있습니다. 주요 주제로는 커스텀 모델, 델리게이트, 편집 기능, 데이터의 정렬 및 필터링 등이 있습니다.
#### 커스텀 모델
기본 제공 모델 외에도, 필요에 따라 커스텀 모델을 구현할 수 있습니다. 커스텀 모델은 `QAbstractListModel`, `QAbstractTableModel`, `QAbstractItemModel` 등을 상속받아 구현합니다.
**커스텀 리스트 모델 예제**
```python
import sys
from PySide6.QtCore import Qt, QAbstractListModel
from PySide6.QtWidgets import QApplication, QListView, QMainWindow
class CustomListModel(QAbstractListModel):
def __init__(self, data):
super(CustomListModel, self).__init__()
self._data = data
def data(self, index, role):
if role == Qt.DisplayRole:
return self._data[index.row()]
def rowCount(self, index):
return len(self._data)
app = QApplication(sys.argv)
data = ["Item 1", "Item 2", "Item 3"]
model = CustomListModel(data)
window = QMainWindow()
list_view = QListView()
list_view.setModel(model)
window.setCentralWidget(list_view)
window.show()
app.exec()
```
이 예제에서는 `QAbstractListModel`을 상속받아 커스텀 리스트 모델을 구현했습니다. `data` 메서드와 `rowCount` 메서드를 재정의하여 모델 데이터를 제공합니다.
#### 델리게이트
델리게이트는 뷰에서 항목을 표시하고 편집하는 방식을 커스터마이즈할 수 있습니다. `QStyledItemDelegate` 클래스를 상속받아 델리게이트를 구현합니다.
**커스텀 델리게이트 예제**
```python
import sys
from PySide6.QtCore import Qt, QAbstractListModel
from PySide6.QtWidgets import QApplication, QListView, QMainWindow, QStyledItemDelegate, QSpinBox
class CustomListModel(QAbstractListModel):
def __init__(self, data):
super(CustomListModel, self).__init__()
self._data = data
def data(self, index, role):
if role == Qt.DisplayRole:
return self._data[index.row()]
def rowCount(self, index):
return len(self._data)
class SpinBoxDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
editor = QSpinBox(parent)
editor.setMinimum(0)
editor.setMaximum(100)
return editor
def setEditorData(self, editor, index):
value = int(index.model().data(index, Qt.DisplayRole))
editor.setValue(value)
def setModelData(self, editor, model, index):
model.setData(index, editor.value(), Qt.EditRole)
def updateEditorGeometry(self, editor, option, index):
editor.setGeometry(option.rect)
app = QApplication(sys.argv)
data = ["10", "20", "30"]
model = CustomListModel(data)
window = QMainWindow()
list_view = QListView()
list_view.setModel(model)
delegate = SpinBoxDelegate()
list_view.setItemDelegate(delegate)
window.setCentralWidget(list_view)
window.show()
app.exec()
```
이 예제에서는 `QStyledItemDelegate`를 상속받아 `SpinBoxDelegate`를 구현했습니다. 델리게이트는 `QSpinBox`를 사용하여 리스트 항목을 편집합니다.
#### 정렬 및 필터링
`QSortFilterProxyModel`을 사용하여 데이터의 정렬 및 필터링을 구현할 수 있습니다.
**정렬 및 필터링 예제**
```python
import sys
from PySide6.QtCore import Qt, QSortFilterProxyModel
from PySide6.QtWidgets import QApplication, QListView, QMainWindow, QLineEdit, QVBoxLayout, QWidget
class CustomListModel(QAbstractListModel):
def __init__(self, data):
super(CustomListModel, self).__init__()
self._data = data
def data(self, index, role):
if role == Qt.DisplayRole:
return self._data[index.row()]
def rowCount(self, index):
return len(self._data)
app = QApplication(sys.argv)
data = ["Banana", "Apple", "Cherry"]
model = CustomListModel(data)
proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model)
proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
proxy_model.setFilterKeyColumn(0)
window = QMainWindow()
list_view = QListView()
list_view.setModel(proxy_model)
filter_edit = QLineEdit()
filter_edit.setPlaceholderText("Filter...")
filter_edit.textChanged.connect(proxy_model.setFilterFixedString)
layout = QVBoxLayout()
layout.addWidget(filter_edit)
layout.addWidget(list_view)
container = QWidget()
container.setLayout(layout)
window.setCentralWidget(container)
window.show()
app.exec()
```
이 예제에서는 `QSortFilterProxyModel`을 사용하여 데이터를 필터링하고 정렬합니다. `QLineEdit`을 사용하여 필터 텍스트를 입력받고, `textChanged` 시그널을 통해 필터를 적용합니다.
### 결론
이 장에서는 모델 뷰 프로그래밍의 고급 기능에 대해 알아보았습니다. 커스텀 모델, 델리게이트, 정렬 및 필터링 등을 사용하여 더 복잡하고 강력한 애플리케이션을 개발할 수 있습니다. 다음 장에서는 데이터베이스와의 연동을 살펴보겠습니다.
'PYTHON(파이썬) > PYSIDE6(GUI)' 카테고리의 다른 글
PYSIDE6 멀티스레딩 (0) | 2024.10.24 |
---|---|
PYSIDE6 데이터베이스 작업 (1) | 2024.10.24 |
PYSIDE6 QT의 모델 뷰 아키텍처 (3) | 2024.10.24 |
PYSIDE6 MVC 소개 (2) | 2024.10.24 |
PYSIDE6 QT 스타일 시트(QSS) (0) | 2024.10.24 |