可变大小模型
所有种类的模型都支持行的插入和删除。表格模型和层次模型还支持列的插入和删除。在模型的维度发生改变之前和之后,让其他的组件意识到这种变化是很重要的。所以,可以通过实现以下这些方法来改变模型的大小,但是这些方法的实现必须保证调用合适的方法来使与模型相关的视图和委托意识到变化:
insertRows():用来给所有类型的模型添加新行和新的数据项。该方法的实现必须在向任何底层数据结构插入新行之前调用beginInsertRows()方法,并且在插入完成后立即调用endInsertRows()方法。
removeRows():用来删除任何模型包含的行和数据项。该方法的实现必须在从任何底层数据结构删除行之前调用beginRemoveRows()方法,并且在删除完成后立即调用endRemoveRows()方法。
insertColumns():用来给表格模型或层次模型添加新列和新的数据项。该方法的实现必须在向任何底层数据结构插入新行之前调用beginInsertColumns()方法,并且在插入完成后立即调用endInsertColumns()方法。
removeColumns():用来删除表格模型或层次模型包含的行和数据项。该方法的实现必须在从任何底层数据结构删除行之前调用beginRemoveColumns()方法,并且在删除完成后立即调用endRemoveColumns()方法。
一般地,这些方法在成功执行之后应该返回true。然而在一些情况下,这些行为可能只成功了一部分;比如,能够被插入的行数比指定的行数要少。在这种情况下,模型应当返回false来宣布失败,从而使能任何相关的组件来处理这种情况。
改变大小的API的实现过程中调用的方法所发射的信号会给与模型相关联的组件一个在任何数据变得不可用之前采取行动的机会。带有开始和结束方法的插入和删除方法的封装也使得模型能够正确处理长期模型索引。
一般情况下,开始和结束方法能够把该模型的底层数据结构的变化通知给其他的部件。但是对于比较复杂的数据结构的变化而言,比如数据的内部重组或者排序,应当发射layoutChanged()信号来使得任何视图获得更新。
模型数据的懒加载
模型数据的懒加载有效地允许有关模型信息的请求被拖延到视图真正需要它的时候才发送。
有些模型需要从远程数据库中获得数据,或者由于数据的组织方式的原因,在获取数据时必须进行非常耗时的操作。为了精确地显示模型数据,视图一般会尽可能多地请求数据,限制返回给他们的信息量从而减少不必要的数据跟进的请求是非常有用的。