模型/视图(基础知识)
开篇但不点题
MFC中就有文档/视图模式,这种模式好像叫什么观察者模式之类的似乎,就是数据和显示分离,好多个 view 观察着 data 之类的。可以通过 view(可能有多个)来修改 data,当 data 改变了之后要通知所有的 view 修改自己的显示!(好像核心就是这个:))
Model View Controller
MVC包含三个组件:
- Model -> 应用对象,表示数据
- View -> 用户界面,显示数据
- Controller -> 定义了界面与用户的交互方式
- 模型与数据进行通信,为架构中的其他组件提供了接口
- 视图从模型中获得模型索引(Model Index)
- 模型索引用来显示数据
- 当编辑项目时,代理使用模型索引直接与模型进行通信!
- 将视图和控制组件结合起来就形成了模型/视图架构
- 为了用户输入能进行灵活处理,还引入了委托(Delegate,代理)
- Delegate的引入后,就可以定制数据的渲染和编辑方式!
模型、 视图、 代理
其中每一个组件都使用了抽象基类来定义,三者之间通过信号和槽来实现通信
- -> 当数据源数据发生改变时,模型发出信号告知视图。
- -> 当用户与显示的项目交互时,视图发出信号提供交互信息。
- -> 当编辑时,代理发出信号,告知模型、视图编辑器的状态。
模型
- 所有的模型都基于QAbstractItemModel类,这个牛x类定义了一个接口,可以提供视图、委托来访问数据。
- 数据本身并不是一定要存储在模型中,也可以存储在一个数据结构、一个独立的类、文件、数据库、应用程序中的其他组件中。
- 这个类提供的接口让数据可以灵活的处理各种视图,这些视图可以将数据变现为:表格(table)、列表(list)、树(tree)等形式。
Qt还提供了一些现成的模型来处理数据项:
- -> QStringListModel 用来存储一个简单的QString项目列表
- -> QStandardItemModel 管理复杂的树形结构数据项,每一个数据项可以包含任意的数据
- -> QFileSystemModel 提供了本地文件系统中文件、目录的信息
- -> QSqlQueryModel、QSqlTableModel、QSqlRealtionalTableModel 用来访问数据库
视图
Qt提供了几种不同的类型的视图,他们都完全实现了各自的功能。
- -> QListView 将数据项显示为一个列表。
- -> QTableView 将模型中数据项先是在一个表格中。
- -> QTreeView 将模型的数据项显示在具有层次的列表中。
代理
- QAbstractItemDelegate是代理的抽象基类。
- 从Qt 4.4版本开始,默认的委托实现由QStyledItemDelegate类提供,这也被用作Qt标准视图的默认委托。
- QStyledItemDelegate 和 QItemDelegate 是相互独立的,只能选择其一来为视图中的项目绘制和提供编辑器,他们的主要不同就是:QStyleItemDelegate使用当前的样式来绘制他的项目,就是说你要使用样式表(QSS),就用这个作为基类
参考:
不二如是: https://fishc.com.cn/forum.php?mod=viewthread&tid=79233&ctid=447
柔弱胜刚强.:
大学时候写的,现在自己也看不懂了
BBQKirito: 佬,这么专业的文章咋没人赞呢。。。 正好我最近在出题造数据,想了解一下随机数产生机制,非常感谢!!!
tumu_C: 强,茅塞顿开。还得练习才能变成自己的东西。
Lansonli: 博主原创不容易啊,过来支持一下哈,最近在更新大数据系列文章,有兴趣可以关注看看~
water___Wang: 最近正好在看这方面的东西