QListView、QTreeView等是否缓存和回收QitemView,还是一次加载所有内容?

QListView、QTreeView等是否缓存和回收QitemView,还是一次加载所有内容?,qt,Qt,我来自iOS开发,其中基本的UITableView和UIScrollView容器缓存并回收表格单元格,只加载用户滚动时可见的内容,以节省内存并提高性能 我一直在试图找出QListView、QTreeView等容器是否以这种方式工作,或者它们是否加载了整个数据源,而不管实际显示的是哪一部分 我还没有遇到任何问题,但我正在使用一个可能有数千条记录的SQLite db,QListView将显示每个记录的缩略图和文本。到目前为止,使用几百条记录进行测试性能良好,但我想知道Qt模型/视图方法是否可以很好地

我来自iOS开发,其中基本的
UITableView
UIScrollView
容器缓存并回收表格单元格,只加载用户滚动时可见的内容,以节省内存并提高性能

我一直在试图找出
QListView
QTreeView
等容器是否以这种方式工作,或者它们是否加载了整个数据源,而不管实际显示的是哪一部分


我还没有遇到任何问题,但我正在使用一个可能有数千条记录的SQLite db,
QListView
将显示每个记录的缩略图和文本。到目前为止,使用几百条记录进行测试性能良好,但我想知道Qt模型/视图方法是否可以很好地扩展,或者我是否需要考虑自己管理它。

所有Qt小部件一次加载所有数据,但它们只有在可见时才被绘制。关于这一点没有直接的说明,但你可以自己检查。尝试创建,例如,列表中有50个项目,然后是50000个项目。你会看到区别的


根据我的经验,小部件中的1000多个项目可能会在绘制和重新绘制小部件时造成一些延迟,但在滚动时不会。如果你只是加载项目,而它们是静态的,我认为你不应该打扰这件事。在其他情况下,您应该使用来控制绘制行的数量。

在一般模型/视图体系结构中,模型不知道视图上需要显示多少单元格。View非常清楚在特定时间可以看到多少行/列。因此,在QtisforQlistView中,它将调用“QAbstractItemModel::data(index,Qt::DisplayRole)”,并使用适当的索引来显示项。。因此,它只加载QListView上可见的内容。但是,每当更新任何特定单元格时,必须从模型中发出“dataChanged()”。因此,view可以调用相应的slot,在模型的“QabstractemModel::data”的帮助下更新可见区域。答案是肯定的,你可以很好地使用Qt


另一种方法是使用QGraphicsView框架,它也是这样做的,QGraphicsSites只针对可见场景区域进行更新。但是您需要调用“setPos()”来明确地布局项目。

我的经验也是,拥有成百上千个项目的速度非常慢。有关
QTreeView
QListView
QTableView
的内存分析,请参阅。他们的结论是:
QTableView
应该用于非常大的数据集。@Nathan:谢谢-很高兴知道。