{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/mvc-framework/",
  "atlas": "https://www.pystone.net/?node=mvc-framework#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/mvc-framework.md",
  "context": "https://www.pystone.net/notes/mvc-framework.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:mvc-framework",
  "slug": "mvc-framework",
  "title": "MVC（Model-View-Controller）框架",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "MVC（Model View Controller）框架",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "89c4bc68a8b300738078496319643896fd368f8d274ae240f10388f3969c94c2",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "MVC（Model-View-Controller）框架",
      "anchor": "mvcmodel-view-controller框架",
      "citation": "https://www.pystone.net/notes/mvc-framework/#mvcmodel-view-controller%E6%A1%86%E6%9E%B6"
    },
    {
      "depth": 3,
      "text": "1. 模型（Model）：",
      "anchor": "1-模型model",
      "citation": "https://www.pystone.net/notes/mvc-framework/#1-%E6%A8%A1%E5%9E%8Bmodel"
    },
    {
      "depth": 3,
      "text": "2. 视图（View）：",
      "anchor": "2-视图view",
      "citation": "https://www.pystone.net/notes/mvc-framework/#2-%E8%A7%86%E5%9B%BEview"
    },
    {
      "depth": 3,
      "text": "3. 控制器（Controller）：",
      "anchor": "3-控制器controller",
      "citation": "https://www.pystone.net/notes/mvc-framework/#3-%E6%8E%A7%E5%88%B6%E5%99%A8controller"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:software-engineering-and-quality",
      "title": "软件工程与质量保障",
      "url": "https://www.pystone.net/notes/software-engineering-and-quality/",
      "atlas": "https://www.pystone.net/?node=software-engineering-and-quality#knowledge-atlas",
      "label": "软件工程与质量保障",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "软件体系结构与设计模式中的“MVC（Model-View-Controller）框架”导航项",
      "citation": "https://www.pystone.net/notes/software-engineering-and-quality/#%E8%BD%AF%E4%BB%B6%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84%E4%B8%8E%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F"
    }
  ],
  "contentMarkdown": "# MVC（Model-View-Controller）框架\n\n﻿# MVC（Model-View-Controller）框架\n\n将数据（模型）、用户界面（视图）和业务逻辑（控制器）分开\n\n- **模型**（`BashAction`和`BashActionModel`）定义了数据和与数据相关的操作。\n- **视图**（基于`QListView`和`BashActionDelegate`）负责显示数据。\n- **控制器**（`MainController`）负责协调视图和模型，处理用户的输入。\n\n### 1. 模型（Model）：\n模型代表了数据和业务逻辑。在这个案例中，您的模型将是`BashAction`及其子类。您需要定义一个基类`BashAction`，然后根据需要定义子类。\n\n```python\nclass BashAction:\n    def __init__(self, description):\n        self.description = description\n\n    # ... 其他方法和属性 ...\n\n```\n\n接着，创建一个自定义的模型来管理`BashAction`对象。这个模型负责存储和管理`BashAction`对象的列表，提供添加、删除和更新操作。\n\n```python\nclass BashActionModel(QAbstractListModel):\n    # ... 代码同前面所述 ...\n\n```\n\n### 2. 视图（View）：\n视图负责显示用户界面。在这个案例中，视图是展示`BashAction`对象的列表。您将使用Qt的`QListView`作为视图组件。\n\n```python\nself.listViewActionData = self.ui.findChild(QListView, \"listActionData\")\n\n```\n然后，使用自定义的代理来定义如何绘制每一行：\n```python\nclass BashActionDelegate(QStyledItemDelegate):\n    # ... 代码同前面所述 ...\n\n```\n\n### 3. 控制器（Controller）：\n控制器负责协调模型和视图，处理用户输入，并执行相应的模型更新。在这个案例中，控制器将是管理`BashActionModel`和`BashActionDelegate`的代码。\n\n在您的主控制器中，您需要实例化模型和代理，并将它们设置到视图中。同时，控制器也会处理用户的行为，如添加、删除`BashAction`对象。\n\n```python\nclass MainController:\n    def __init__(self):\n        self.model = BashActionModel()\n        self.delegate = BashActionDelegate()\n        self.view = self.ui.findChild(QListView, \"listActionData\")\n        self.view.setModel(self.model)\n        self.view.setItemDelegate(self.delegate)\n\n    def addBashAction(self, action):\n        # 当用户想要添加新的 BashAction 时调用\n        self.model.addBashAction(action)\n\n    # ... 其他行为如删除、更新等 ...\n\n```\n"
}
