做个可以动态扩展数据的Model(转)

一般的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同样适用。 大家写代码的时候要特别注意。
附件里给出了一个笔者写的动态扩展数据的Model的例子, 希望对大家有所帮助!

你可能感兴趣的:(职场,Model,qt,休闲)