(注:原本想弄成VIP可见的,但是又没有时间去调整和优化,所以仅记录相关知识点,可能会有点乱和没有逻辑,大家有任何疑问欢迎留言,看到必回复。等有时间后,可能会调整为VIP可见。)
继续以和饭相关的切入主题:一家四口A,B,C,D围在一张桌子上吃饭,此时只有一个电饭煲,每个人直接去电饭煲打饭就行。这就是多个view(一家四口)和model(电饭煲)的关系。换个角度(界面组件自身带数据),若是A将电饭煲据为己有,则BCD想要吃饭,则需要跟A请求,A同意后,再从电饭煲打饭,分发给BCD,仅仅吃个饭而已,居然这么麻烦!!!
代理(delegate)类似于饭勺,ABCD都是通过饭勺将米饭盛到碗里。自定义代理
1,
View:视图,指的是显示和编辑数据的界面组件
model:是视图与原始数据之间的接口
2,将界面组件与所编辑的数据分离开来,又通过数据源的方式连接起来,是处理界面与数据 的一种较好的方式
注:为什么说是一种较好的方式,我是这样理解的,假设界面与所编辑的数据绑定在一起,如果程序中其他的地方需要用到该数据,需要与该界面有所交互,例如先访问界面,发送请求,再定位到数据,获取数据等等,不仅流程复杂,还不易于扩展,比如在后期增加访问该数据,修改的地方肯定很多,对程序的维护也是麻烦事。而采用view/model架构,model是数据的唯一接口,并且可以被多个view访问和修改,对于界面来说,我只需要访问model就行了,而这,qt中有各种各样的函数接口可供使用。因此,扩展界面是非常方便的。
3,model/view基本结构
- 数据:实际的数据,如数据库的一个数据表、内存中的stringlist等等
- 视图或视图组件:屏幕上的界面组件,视图从数据模型(model)获得每个数据项的模型索引(index),通过模型索引获取数据,然后为界面组件提供显示数据。如qlistview、qtreeview、qtableview等。
- 模型或数据模型:与实际数据通信,并为视图组件提供数据接口。从原始数据提取需要的内容,用于视图组件进行显示和编辑。
4,代理(delegate)
作用:让用户定制数据的界面显示和编辑方式。
我是这么理解的:举例来说,对于qtableview界面组件,在显示时是二维表格,每一个小格子都对应着一个数据和一个代理。当在界面上选中某个单元格进行数据编辑时,其实选中的是代理,标准组件的代理是qlineedit组件,代理通过模型索引和数据模型通信,并为编辑数据提供一个编辑器。可以用自定义的代理,替换标准组件代理,就能实现定制界面的显示和编辑方式。
5,模型、视图和代理之间使用信号和槽通信。
当源数据发生变化时,数据模型发射信号通知视图组件;当用户在界面上操作数据时,视图组件发射信号表示这些操作信息;当编辑数据时,代理发射信号告知数据模型和视图组件编辑器的状态。
6,视图组件在显示数据时,只需调用视图类的setModel()函数,为视图组件设置一个数据模型,就可以实现视图组件与数据模型之间的关联,在视图组件上的修改将自动保存到关联得数据模型里,一个数据模型可以同时在多个视图组件里显示数据。
7,代理(delegate):在视图组件上为编辑数据提供编辑器,如在表格组件中编辑一个单元格的数据时,缺省是使用一个qlineEdit编辑框。代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。
8,模型索引: - 通过数据模型存取的每个数据都有一个模型索引,视图组件和代理都通过模型索引来获取数据。
- 通过模型索引的行号和列号可以存取数据
- 获得一个模型索引,必须提供3个参数:行号、列号、父项的模型索引。
- 对于列表和表格模式的数据模型,顶层节点总是用QModelIndex()表示。
例如:
9,父项:
当数据模型是列表或表格时,所有数据项的父项就是顶层节点;当数据模型是树状结构时,一个节点可以有父节点,也可以是其他节点的父节点,因此必须指定正确的行号、列号和父节点。
例:
案例1
单击treeview的一个节点时,此节点就设置为listView和tableView的根节点。
源代码
源码
案例2
窗口左侧是对qstringlistmodel的一些操作,右侧的qplainTextEdit组件显示相关内容,以查看是否与listview组件显示的内容是否一致。
源代码:
源码
案例3
运行截图
功能:
1,action的使用,如顶层中的打开、另存文件。。。。
2,读取txt文件,并将内容显示在tableView和txt文件中。
3,使用自定义代理组件:qspinbox/qdoublespinbox/qcombobox等
4,根据数据,条件设置单元格背景色或字体颜色,例如优u是绿色,一般是红色等
注:因该部分也是我查阅大量资料的基础上才完成的,因此,不在本文中编写,后续会单独写一篇。如果有人急需,可私信留言即可。