1

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

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

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

4

2 回答 2

2

所有 Qt 小部件一次加载所有数据,但它们仅在可见时才被绘制。对此没有直接的说明,但您可以自己检查。尝试创建例如包含 50 个项目的列表,然后创建 50 000 个项目。你会看到区别。

根据我的经验,我可以说,小部件中的 1000 多个项目可能会导致绘制和重新绘制小部件时出现一些延迟,但在滚动时不会。如果您只加载项目并且它们将是静态的,我认为您不应该打扰这件事。在其他情况下,您应该使用setItemDelegateForRow()来控制绘制的行数。

于 2013-08-30T06:41:38.407 回答
0

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

另一种方法是使用 QGraphicsView 框架,它的作用相同,QGraphicsItems 仅针对可见场景区域进行更新。但是你需要调用“setPos()”来明确地布置项目。

于 2013-08-30T06:41:47.300 回答