qt中的model/view详解,及自定义代理(delegate)设计,案例下载

(注:原本想弄成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是绿色,一般是红色等
    注:因该部分也是我查阅大量资料的基础上才完成的,因此,不在本文中编写,后续会单独写一篇。如果有人急需,可私信留言即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值