一文搞懂Qt模型视图框架:MVC/MVD架构详解与实战(Awesome_Qt_Learning)
【免费下载链接】Awesome_Qt_Learning2025年 qt 开发最新总结,提供全面的 qt 开发学习资源,涵盖从基础知识到实战项目的资料、文献、书籍、项目和示例,帮助你快速入门并逐步进阶,持续更新维护中!项目地址: https://gitcode.com/gh_mirrors/aw/Awesome_Qt_Learning
Awesome_Qt_Learning 是一个 2025 年 Qt 开发学习资源库,系统化收录了从 Qt 基础到实战项目的资料、书籍与面试题。本文带你一文搞懂Qt 模型视图框架(Model/View Framework)的核心思想,讲清楚 MVC 与 MVD 架构的区别,并给出新手快速上手模型视图实战的学习路径。
📌 什么是 Qt 模型视图框架?
简单说,Qt 模型视图框架是 Qt 用于"显示数据"的一套机制:它把"数据"和"数据的显示方式"彻底分开。
- Model(模型):负责保存数据,提供统一的数据访问接口,与界面无关
- View(视图):负责把数据显示出来并处理交互,与数据来源无关
- Delegate(代理,MVD 特有):负责单个数据项的绘制与编辑
这种"数据表示与显示分离"的设计带来三个直接好处:
- 一份数据,多种显示:同一个模型可以同时绑定列表视图、树视图、表格视图
- 替换显示方式零成本:想从列表改成表格?换一个视图类即可,数据不动
- 性能更好:视图只请求屏幕上可见的数据项,百万行数据也能流畅滚动
💡 你可以把它理解为 Excel:数据是"表格内容",显示方式是"视图",单元格怎么画、能否编辑由"代理"决定。
🔍 MVC 与 MVD:一张表看懂核心区别
很多初学者会被 MVC、MVD 两个名词绕晕。它们解决的是同一个问题(数据与界面解耦),只是"第三个角色"的分工不同:
| 对比项 | MVC | MVD(Qt 实际采用) |
|---|---|---|
| 第三个角色 | Controller 控制器 | Delegate 代理 |
| 职责 | 处理业务逻辑、协调数据与界面 | 负责每个数据项的绘制与编辑输入 |
| 数据来源与编辑 | 控制器中转 | 视图通过代理直接读写模型 |
| 典型基类 | 无统一基类 | QAbstractItemModel/QAbstractItemView/QAbstractItemDelegate |
| 代表实现 | 传统 Web 框架常见 | Qt Widgets 的模型视图框架 |
用一句话总结:
Qt 中的 MVD 是 MVC 的"变形记":Qt 把控制器的部分职责(样式绘制、输入处理)下沉给了 Delegate,让数据项的展示细节可以完全独立定制,而不需要写一个庞大的控制器。
三者之间通过信号槽机制通信:模型数据变化时发出信号,视图自动刷新;用户在视图中编辑数据时,代理负责把编辑状态写回模型层。
🧩 核心类清单:Qt 模型视图框架常用 3 类角色
Model 模型层(数据从哪来)
| 类名 | 用途 |
|---|---|
QAbstractItemModel | 抽象模型基类,自定义模型的起点 |
QStandardItemModel | 通用标准模型,最常用,"什么数据都能装" |
QStringListModel | 纯字符串列表模型 |
QSqlTableModel/QSqlRelationalTableModel | 直接绑定数据库表,支持增删改查 |
QFileSystemModel | 文件系统模型,用来做文件管理界面 |
View 视图层(数据怎么显示)
| 类名 | 显示形式 |
|---|---|
QListView | 列表(单列条目) |
QTreeView | 树(层级结构,如目录树) |
QTableView | 表格(行 × 列,如数据库表格) |
QAbstractItemView | 以上三者的抽象基类 |
Delegate 代理层(每个格子怎么画)
| 类名 | 用途 |
|---|---|
QAbstractItemDelegate | 抽象代理基类 |
QStyledItemDelegate | 基于样式系统的代理,可自定义绘制逻辑 |
QItemEditorFactory | 编辑器工厂,决定双击某格时弹出什么编辑器(文本框/下拉框/滑块) |
⚠️ 新手注意:QListWidget、QTableWidget、QTreeWidget这些Widget 类内部也内置了模型,使用简单但灵活性差;正式项目建议优先使用"Model + View"组合。
🛠 模型视图实战:3 步做出一个数据表格
以最常见的"数据库 + 表格显示"场景为例,核心流程只有三步(代码极短,重在理解流程):
- 建模型:创建
QSqlTableModel并绑定一张数据表 - 建视图:创建
QTableView作为显示容器 - 绑定:调用视图的
setModel(),界面立即出现数据
QSqlTableModel *model = new QSqlTableModel(&db); model->setTable("employees"); model->select(); // 查询全部数据 QTableView *view = new QTableView(&db); view->setModel(model); // 模型与视图绑定,完成!此时你得到了一个自带排序、编辑、选择能力的表格。想自定义单元格样式(比如给"余额为 0"的格子标红),再叠加一个QStyledItemDelegate即可,模型和视图完全不用改。
📚 从面试到实战:配套学习资料清单
以下资料均来自本仓库,按"先概念、再架构、后实战"的顺序安排,帮你高效入门 Qt 模型视图框架:
1️⃣ 核心概念(建议先读)
- qt 面试题/128、Qt中的模型视图框架是什么?.md —— 模型视图框架的标准定义
- qt 面试题/19、Qt模型.md —— View 与 Model 的对应关系速览
- qt 面试题/16、Qt对象树.md —— 理解模型/视图的内存管理前提
2️⃣ 架构深入(MVC / MVD 对比)
- qt 面试题/131、什么是Qt的MVC架构?.md —— MVC 架构概念
- qt 面试题/20、Qt中的MVD了解吧?.md —— MVD 架构与基类详解
- qt 面试题/57、Qt中的MVD了解吗?.md —— MVD 高频面试题参考
3️⃣ 延伸学习(进阶与实战)
- qt 面试题/114、Qt如何操作数据库.md —— 模型视图最常见的实战场景
- qt 面试题/167、Graphics View图形视图框架结构?.md —— 另一套"场景-视图"框架,对比学习
- paper/Qt参考手册.pdf —— 模型视图类完整 API 参考
- paper/Qt对象模型.pdf —— 理解 QObject 与信号槽基础
- paper/Qt工程师进阶技术《23种设计模式》.pdf —— 从设计模式视角理解 MVC
- 入门五讲/第005讲 Qt开发常用算法及控件原理.pdf —— 常用控件(含高级控件)原理精讲
- books/7-Qt Creator快速入门.pdf —— 用 Qt Creator 动手跑通第一个模型视图示例
✅ 小结
- Qt 模型视图框架= 数据(Model)与显示(View)分离,一份数据可绑定多种视图
- Qt 实际采用 MVD 架构:Delegate 取代 Controller,专门负责数据项的绘制与编辑
- 自定义模型的起点是
QAbstractItemModel,新手从QStandardItemModel+QTableView组合练手最快 - 掌握"建模型 → 建视图 → setModel 绑定"三步流程,再按需叠加 Delegate 定制样式
学完本文后,按上面的资料清单逐个击破,你就能在 Qt 项目中熟练驾驭表格、列表、树形等各种数据展示需求了。
【免费下载链接】Awesome_Qt_Learning2025年 qt 开发最新总结,提供全面的 qt 开发学习资源,涵盖从基础知识到实战项目的资料、文献、书籍、项目和示例,帮助你快速入门并逐步进阶,持续更新维护中!项目地址: https://gitcode.com/gh_mirrors/aw/Awesome_Qt_Learning
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考