13.2.4 QStandardItemModel(2)
代码段13 12,使用QStandardItemModel处理树,取自z:\examples\mvc\QStandardItemModel_demo\main.cpp
类QStandardItemModel之所以能够表示列表、表格、树甚至更复杂的数据结构,得益于类QStandardItem在其内部定义了一个类型为QVector
- QStandardItemModel treeModel;
- QStandardItem *parentItem = treeModel.invisibleRootItem();
- for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("%0").arg(i));
- parentItem->appendRow(item);
- parentItem = item;
- }
- QTreeView treeView;
- treeView.setModel( & treeModel );
|
| 图13 13 类QStandardItem使用自关联以形成层次结构 |
|
| (点击查看大图)图13 14 类QStandardItem使用自关联形成列表、表格与树 |
列表被看作一个特殊的树:不可见根具有若干个子节点,每个子节点表示列表中的一个数据项,不再包含任何子节点,如该图左侧所示。而表格的表示方式反而麻烦一些。不可见根含有若干子节点(图中A,B,C),这些子节点并不表示数据集中的任何数据项。第i个子节点会包含若干子节点(比如图中D,E,F),这些子节点才表示表格第i行的数据项。
使用QStandardItemModel表示数据集具有以下优点:该类使用QStandardItem存放数据项,用户不必定义任何数据结构来存放数据项;QStandardItem使用自关联关系,能够表达列表、表格、树甚至更复杂的数据结构,能够涵盖各种各样的数据集;QStandardItem本身存放着多个『角色,数据子项』,视图类、委托类或者其他用户定义的类能够方便地依据角色访问各个数据子项。
然而,这种表示方法也有局限性:当数据集中的数据项很多时,施加在数据集上的某些操作的执行效率会很低。比如,设数据集是一个1万行、20列的表格,其中第10列存放的是浮点数。如果我们想计算这一列的平均值,按照图13 14,这需要遍历所有行,取得第10列的QStandardItem对象,再依据角色"Qt::DisplayRole"取得对应的数据子项。由于这个数据子项的类型为QString,还需要将其转换为浮点数,最后求所有浮点数的平均值。这些操作会耗费较长的时间。
因此,对于数据量不是很大、对性能要求不是很高的场合,我们可以使用类QStandardItemModel来表示一个数据集。否则,用户应该从QAbstractItemModel、QAbstractListModel或者QAbstractTableModel派生新类,自行管理数据集的存放与访问。

