QListView理论总结
- 一、概述
- 二、提高性能
- 三、使用注意
一、概述
QListView显示存储在model 中的item,要么是一个简单的非层次列表,要么是一个图标集合。这个类用于提供列表和图标视图,之前像这些 列表 和 图标视图 之前是由QListBox和 QIconView 类提供的,但使用Qt的model/view架构提供的更灵活的方法。也是Qt 推荐使用的方法。
就像Windows的系统资源管理器里面的文件夹的一列,只有一列,就像下面的这种。
QListView类是Model/View类之一,是Qt的Model/View框架的一部分。
这个视图类不显示水平或垂直标题;要以水平标题显示item目列表,请使用QTreeView。
QListView实现了由QAbstractItemView类定义的接口,以允许它显示由QAbstractItemModel类派生的模型提供的数据。
列表视图中的item目可以使用两种视图模式之一来显示:
- 在ListMode中,item目以简单列表的形式显示;
- 在IconMode中,列表视图采用图标视图的形式;
item目以类似文件管理器中的文件的图标显示。默认情况下,列表视图是ListMode。要更改视图模式,请使用setViewMode()函数;要确定当前的视图模式,请使用viewMode()。
这些视图中的元素按照 QListView 中的flow()方法指定的方向排列。元素可以固定在原地,也可以移动,这取决于视图的movement()状态。
如果模型中的item不能按流的方向完全布局,可以将它们包装在视图部件的边界上;这依赖于isWrapping()。当item目通过图标视图表示时,这个属性很有用。
resizeMode()和layoutMode()控制如何以及何时布局元素。item目之间的间距取决于它们的spacing(),并且可以存在于由gridSize()指定的概念网格中。根据元素的iconSize(),它们可以被渲染为大图标或小图标。
二、提高性能
在显示大量item目时,可以给视图提示它正在处理的数据,以提高其性能。如果视图希望显示相同大小的元素,可以将uniformItemSizes属性设置为true。
三、使用注意
这个类的使用一般都是搭配着 QAbstractListModel
QAbstractListModel为模型提供了一个标准接口,这些模型将其数据表示为简单的非层次项目序列。也就是只能一维,不能像树的那种形式弄成二维的。而且它不能直接使用,必须创建子类,当然也可以用他的一个子类 QStringListModel 去处理字符串之类的。
由于该模型提供了比QAbstractItemModel更专用的接口,它不适合与树视图一起使用;如果你想为此提供一个模型,你将需要子类QAbstractItemModel。如果你需要使用大量的列表模型来管理数据,那么子类化QAbstractTableModel可能更合适。
通过继承这个类并实现所需函数的最少数量,可以创建简单的模型。
例如,我们可以实现一个简单的只读的基于QStringList的模型,它为QListView控件提供一个字符串列表。在这种情况下,我们只需要实现rowCount()函数来返回列表中元素的数量,以及data()函数来从列表中检索元素。
由于模型表示一维结构,因此rowCount()函数返回模型中元素的总数。实现columnCount()函数是为了与所有视图互操作,但默认情况下通知视图模型只包含一个列。
当子类化QAbstractListModel时,必须提供rowCount()和data()函数的实现。行为良好的模型还提供了headerData()实现。
如果你的模型在QML中使用,并且需要roleNames()函数提供的默认角色以外的角色,则必须覆盖它。
对于可编辑列表模型,还必须提供setData()的实现,并实现flags()函数,以便它返回包含Qt::ItemIsEditable的值。
注意,QAbstractListModel提供了columnCount()的默认实现,它通知视图该模型中只有一列项目。
提供可缩放列表类数据结构接口的模型可以实现insertRows()和removeRows()方法。在实现这些函数时,调用适当的函数很重要,这样所有连接的视图都能感知任何变化:
- insertRows()方法的实现必须在向数据结构中插入新行之前调用beginInsertRows()方法,
并且必须在插入之后立即调用endInsertRows()方法。 - removeRows()的实现必须在从数据结构中删除行之前调用beginRemoveRows(),
并且必须在删除之后立即调用endRemoveRows()。