Qt的MV模型,源于但又不同于MVC,其使用的MVD。Model和View的含义未发生变化,通过Delegate(委托或称为代理)来自定义每个条目的显示和编辑方式。
下面是我总结的Qt的MV结构的类间关系图。Qt的MV结构就是这样实现的,我们通过继承重写这些接口类,就可以很方便地将项目中的数据和视图分离。
MODEL/VIEW
- QAbstractItemView
视图从模型中获取模型索引,用其来表示数据项。用户与显示的项目交互时,视图发出信号来提供交互信息。含有槽dataChanged()。
1.1 QColumnView
1.2 QHeaderView
1.3 QListView
1.3.1 QListWidget
1.4 QTableView
1.4.1 QTableWidget
1.5 QTreeView
1.5.1 QTreeWidget - QAbstractItemModel
提供标准接口供视图和委托访问其内部数据源。其子类会以层次化结构来表示数据,这个结构中包含了数据项表。模型中数据改变会通过信号槽机制通知视图。 注意,这是个接口类,其纯虚函数有:index(), parent(), rowCount(), columnCount(), data()。数据改变将发送dataChanged()信号
2.1 QStandardItemModel
2.1.1 QStandardItem
2.2 QAbstractListModel
如需定制,所需的数据结构可以表示为项目列表时,可以子类化该类。注意,这是个接口类,其剩下的纯虚函数还有:rowCount(), data(),需要重写。
1> 重写rowCount(), data()可以实现只读模型
2> 重写headerData()可以定制标头
3> 重写index(), parant()可以创建具有层次结构的模型
4> 重写flags(), setData()可以实现编辑模型
5> 重写insertRows(), removeRows()可以实现插入和删除行
2.2.1 QStringListModel
2.2.1.1 QStringList
2.3 QAbstractTableModel
子类化时需要实现 rowCount(),columnCount(),和data().
2.3.1 QSqlQueryModel
2.3.1.1 QSqlTableModel
2.4 QFileSystemModel - QAbstractItemDelegate
委托渲染数据项,编辑项目时,委托使用模型索引直接与模型进行通信。编辑项目时,委托发出信号,告知模型和视图编辑器的状态。虽然视图也可以直接处理用户输入,但委托可以提供更灵活的交互,例如可以渲染视图中的个别特殊控件项目来和用户交互。 其纯虚函数有:paint(), sizeHint()
3.1 QItemDelegate
简单的基于部件的委托可以通过子类化该类来实现。委托的编辑器可以通过两种方式实现,一种是使用部件来管理编辑过程,另一种是直接处理事件。
3.2 QStyledItemDelegate
与QItemDelegate的差别在于其可以使用当前的样式表设置来绘制组件。 自定义委托时,推荐子类化这个类,然后必须实现下面4个函数:
createEditor()创建用于编辑模型数据的widget组件如QComboBox,
setEditorData()从模型获取数据供widget编辑,
setModelData()更新数据到模型,
updateEditorGeometry()给组件设置一个合适大小 - QModelIndex
模型索引是为了确保数据的表示和获取分离。视图和委托都使用索引来请求数据项并显示。模型索引是对一块数据的临时引用,可以用来检索和修改模型中的数据。获取一个数据项的模型索引,必须指定模型的3个属性:行号,列号和父项的模型索引。 - QItemSelectionModel
5.1 QItemSelection