免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2927 | 回复: 0
打印 上一主题 下一主题

做个可以动态扩展数据的Model [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-24 20:29 |只看该作者 |倒序浏览
一般的Model都是针对固定的数据源, 这里所说的动态扩展数据的Model常用在数据源巨大的情况下, 比如大型数据库每个表可能有数万甚至百万级的数据, 如果是用基本的Model一次性把数据都取出来显示那将是一个恐怖的过程, 搞不好你的系统就玩完了。 记得笔者以前开发字典软件的时候也用过类似的技术, 只是用的QListWidget配合滚动条的事件来实现动态取数据, 这里我们要把这个方法用在Model上了。 Qt目前Model的架构里已经有了相关的设计, 用到的函数有: bool QAbstractItemModel::canFetchMore ( const QModelIndex & parent ) const [virtual] void QAbstractItemModel::fetchMore ( const QModelIndex & parent ) [virtual] int QAbstractItemModel::rowCount ( const QModelIndex & parent = QModelIndex() ) const [pure virtual] 这几个都是虚函数, 也就是我们需要挑选一个Model的类作为基类进行派生, 在派生类里重写这些函数以替代默认的行为。 其中canFetchMore接受一个parent index作为输入参数, 需要返回在该parent下是否还有children数据未被取得, 如果有就返回true, 否则返回false; fetchMore函数则负责具体的获取数据动作, 至于每次取得多少新数据文档里并没有任何建议, 笔者的建议是按照你的view一页所能容纳的数据量来定义, 因为该函数往往在用户点击滚动条翻页的时候被调用, 每次取得一页数据比较经济; rowCount函数应该返回目前在view中能够显示的数据(注意, 这个数并不是所有的数据量, 而是已经被取出的数据量。)。 Qt提供的view类基本上能和这种动态扩展的Model互相配合, 以QTreeView为例, 它根据rowCount的值调用data函数获得需要显示的数据, 仅当用户滚动scrollbar到底端或者用户打开某个树节点查看其children时才fetchMore。 如果我们自己写view类需要注意, 别忘了用上这几个方法让自己的类能很好的融合其他的Qt类。 关于fetchMore的实现, 这里还需要罗嗦几句。 前面我们的blog里介绍了自定义Model的基本写法(参见: 大家一起来写Model), 其中有一点是在增删model数据时需要用beginInsertRows/endInsertRows把增删的语句括起来, 这一点对fetchMore同样适用。 大家写代码的时候要特别注意。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP