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

发布于 2022-09-01 11:01:39 字数 1186 浏览 11 评论 0

一般的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同样适用。 大家写代码的时候要特别注意。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文