---
title: "MVC（Model-View-Controller）框架"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/mvc-framework/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/03-软件工程与质量保障/软件体系结构与设计模式/MVC（Model-View-Controller）框架.md"
content_hash: 89c4bc68a8b300738078496319643896fd368f8d274ae240f10388f3969c94c2
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# MVC（Model-View-Controller）框架

﻿# MVC（Model-View-Controller）框架

将数据（模型）、用户界面（视图）和业务逻辑（控制器）分开

- **模型**（`BashAction`和`BashActionModel`）定义了数据和与数据相关的操作。
- **视图**（基于`QListView`和`BashActionDelegate`）负责显示数据。
- **控制器**（`MainController`）负责协调视图和模型，处理用户的输入。

### 1. 模型（Model）：
模型代表了数据和业务逻辑。在这个案例中，您的模型将是`BashAction`及其子类。您需要定义一个基类`BashAction`，然后根据需要定义子类。

```python
class BashAction:
    def __init__(self, description):
        self.description = description

    # ... 其他方法和属性 ...

```

接着，创建一个自定义的模型来管理`BashAction`对象。这个模型负责存储和管理`BashAction`对象的列表，提供添加、删除和更新操作。

```python
class BashActionModel(QAbstractListModel):
    # ... 代码同前面所述 ...

```

### 2. 视图（View）：
视图负责显示用户界面。在这个案例中，视图是展示`BashAction`对象的列表。您将使用Qt的`QListView`作为视图组件。

```python
self.listViewActionData = self.ui.findChild(QListView, "listActionData")

```
然后，使用自定义的代理来定义如何绘制每一行：
```python
class BashActionDelegate(QStyledItemDelegate):
    # ... 代码同前面所述 ...

```

### 3. 控制器（Controller）：
控制器负责协调模型和视图，处理用户输入，并执行相应的模型更新。在这个案例中，控制器将是管理`BashActionModel`和`BashActionDelegate`的代码。

在您的主控制器中，您需要实例化模型和代理，并将它们设置到视图中。同时，控制器也会处理用户的行为，如添加、删除`BashAction`对象。

```python
class MainController:
    def __init__(self):
        self.model = BashActionModel()
        self.delegate = BashActionDelegate()
        self.view = self.ui.findChild(QListView, "listActionData")
        self.view.setModel(self.model)
        self.view.setItemDelegate(self.delegate)

    def addBashAction(self, action):
        # 当用户想要添加新的 BashAction 时调用
        self.model.addBashAction(action)

    # ... 其他行为如删除、更新等 ...

```
