본문 바로가기
PYTHON(파이썬)/PYSIDE6(GUI)

PYSIDE6 고급 모델 뷰 프로그래밍

by eplus 2024. 10. 24.
728x90
반응형

 

이 장에서는 모델 뷰 프로그래밍의 고급 기능을 다룹니다. 이를 통해 더욱 복잡하고 강력한 애플리케이션을 개발할 수 있습니다. 주요 주제로는 커스텀 모델, 델리게이트, 편집 기능, 데이터의 정렬 및 필터링 등이 있습니다.

 

#### 커스텀 모델

기본 제공 모델 외에도, 필요에 따라 커스텀 모델을 구현할 수 있습니다. 커스텀 모델은 `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` 시그널을 통해 필터를 적용합니다.

 

### 결론

이 장에서는 모델 뷰 프로그래밍의 고급 기능에 대해 알아보았습니다. 커스텀 모델, 델리게이트, 정렬 및 필터링 등을 사용하여 더 복잡하고 강력한 애플리케이션을 개발할 수 있습니다. 다음 장에서는 데이터베이스와의 연동을 살펴보겠습니다.

 

728x90

'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