В этом руководстве вы узнаете, как работает шаблон PyQt Model/View в Python и его преимущества.
Знакомство с шаблоном PyQt «Model/View»
Model-View-Controller или MVC — это программный шаблон для разработки пользовательских интерфейсов(UI). Шаблон MVC разделяет UI(views), данные(models) и логику приложения(controllers):

- Модели представляют данные приложения или содержат логику для получения данных из базы данных.
- Представления отвечают за представление моделей через пользовательский интерфейс.
- Контроллеры обрабатывают вводимые пользователем данные, работают с моделями и выбирают представления для отображения данных.
Целью MVC является разделение задач между моделями, представлениями и контроллерами.
MVC позволяет легко добавлять или изменять views без изменения базовых моделей. Кроме того, MVC позволяет писать модульные тесты, нацеленные на модель и контроллер, без вовлечения пользовательского интерфейса.
Еще одним преимуществом MVC является то, что модель может иметь несколько представлений. И все эти представления могут автоматически обновляться на основе одной и той же модели.
PyQt использует вариант шаблона MVC, объединяя view и controller MVC в view, что приводит к архитектуре Model/View.
Архитектура «Model/View» позволяет PyQt свести взаимозависимость компонентов к минимуму и улучшить возможность повторного использования.
На следующем рисунке показан шаблон PyQt Model/View:

В архитектуре Model/View вид обрабатывает рендеринг данных через делегата. У делегата есть две основные обязанности:
- Отображает данные.
- Взаимодействует с моделью при редактировании данных.
Модели, виды и делегаты взаимодействуют друг с другом посредством сигналов и слотов.
PyQt предоставляет несколько стандартных виджетов Model/View:
- QListView – отображает список элементов
- QTableView – отображает таблицу элементов.
- QTreeView – отображает иерархические данные.
Помимо этих виджетов, виджет QComboBox также поддерживает шаблон Model/View.
Кроме того, PyQt имеет ряд базовых классов моделей, таких как QAbstractListModel, QAbstractTableModel и QStandardItemModel.
Пример Model/View PyQt
Для иллюстрации Model/View PyQt рассмотрим простой пример:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QComboBox, QListView
from PyQt6.QtCore import Qt, QStringListModel
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setGeometry(100, 100, 400, 200)
self.setWindowTitle('PyQt Model/View')
layout = QVBoxLayout()
self.setLayout(layout)
model = QStringListModel()
model.setStringList(['Apple','Banana','Orange'])
self.list_view = QListView()
self.list_view.setModel(model)
self.combo_box = QComboBox()
self.combo_box.setModel(model)
layout.addWidget(self.combo_box)
layout.addWidget(self.list_view)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
Как это работает.
В этом примере у нас есть два виджета: combobox и list view. Оба эти виджета используют одну и ту же модель, которая является экземпляром QStringListModel:

Если вы измените элемент из одного виджета, другой виджет автоматически обновит изменения. Другими словами, вам не нужно писать код, чтобы синхронизировать все виджеты, использующие одну и ту же модель:
- Сначала создайте новый экземпляр класса QStringListModel и задайте список строк:
model = QStringListModel() model.setStringList(['Apple','Banana','Orange'])
- Во-вторых, создайте виджет QListView и установите для него следующую модель:
self.list_view = QListView() self.list_view.setModel(model)
- В-третьих, создайте виджет QComboBox и установите для него ту же модель, что и для виджета QListView:
self.combo_box = QComboBox() self.combo_box.setModel(model)
