QAbstractListModelClass
详细描述:
QAbstractListModel可以被继承以创造一个一维列表模型。
QAbstractListModel为那些把它们的数据显示成一个单一的、无等级关系的数据序列的模型提供了一个标准的接口,它不能被直接使用,必须被继承后使用。
由于 QAbstractListModel提供了一个比QAbstractItemModel更特殊化的接口,用它来显示树状视图是不合适的。如果你想显示树状视图,你需要子类化QAbstractTreeModel。如果你需要大量的列表模型来管理数据,你应该选择子类化QAbstractTableModel来达到这一目的,而不是用 QAbstractListModel。
简单的模型可以通过 1. 子类化 QAbstractListModel + 2. 实现最少数量的必需的函数来创建。比如,我们可以实现一个简单的、只读的、基于QStringList的、为列表视图控件提供一些字符串的模型。在这个例子中,我们只需要实现rowCount()方法和data()方法,rowCount()方法用来返回项的数目,data()方法用来取得每个项中的内容。
由于这个模型只表示一维结构,所以rowCount()方法返回这个模型中所有的项的总数目。为了增强复用性,columnCount()方法可以被实现以便在各种视图中更好地显示。但是默认情况下,这个模型的视图中只有一列。
子类化
当继承QAbstractListModel时,你必须提供rowCount()和data()的实现。如果你想让你的子类运行的更好,你还需要提供headerData()的实现。
如果你的模型正在使用QML而且你需要roleNames()方法提供的以外的角色,你必须重载它。
对于可编辑的列表模型,你还需要实现setData()方法和flags()方法,后者返回一个包含Qt::ItemsEditable的值。
注意,QAbstractListModel提供了columnCount()方法的默认实现,它会通知视图在这个模型中只有一列数据。
为大小可变的数据结构(类似列表)提供接口的模型应当实现insertRows()和removeRows()。当实现这些方法时,千万要记得调用合适的方法来使得与该模型相连的视图能意识到以下这些变化:
1. 在把新的行插入到数据结构中之前,insertRows()方法必须调用beginInsertRows(),并且在插入完成后必须立即调用endInsertRows()。
2. 在把一些行从数据结构中删除之前,removeRows()方法必须调用beginRemoveRows(),并且在删除完成呢个后必须立即调用endRemoveRows()。
注意:关于一些一般化的子类化模型的方法,参见Model Subclassing Reference。
另请参阅:Model Classes,Model Subclassing Reference,QAbstractItemView,QAbstractTableModel和Item Views Puzzle Example。