引言
在我们进行Qt 开发的时候,Qt为我们提供了QListWidget,QTableWidget,QTreeWidget ,他们的基类 分别是 QListView,QTableView,QTreeView。
这几个类特点是使用起来很方便,适合显示比较简单的数据,若是涉及到大量的数据要显示、以及对性能要求严格就得用到视图模型了。
二者的区别在于 QListWidget = QListView + Model
模型
我们先来看看模型
可以把模型嵌套在View 上。每个模型中中都有Item,来操控每一项。
下面使用Tree Model作为例子
- Index用于索引model中的数据,相当于指针下标之类的效果
上图中,A项和C项作为model中顶层的兄弟项:
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());
A有许多孩子,它的一个孩子B用以下代码获取:
QModelIndex indexB = model->index(1, 0, indexA);
通过上面几行代码,可以知道最后一个参数的作用。
视图
视图就是让数据显示出来,然而却无法和用户进行交互,此时便需要代理。
代理
delegate更灵活的处理用户的输入,能够自定义数据条目(item)的显示和编辑方式。
三者的关系
它们之间的关系如下:
- 数据发生改变时,模型发出信号通知视图。
- 用户对界面进行操作,视图发生信号。
- 代理发出信号告知模型和视图编辑器目前的状态。
关系图如下