最近原来项目中使用了QTableWidget来加载20万条的数据量。
它的实现方式是:首先查询数据库获取所有数据的ID列表,垂直滚动条长度则表示实际的数据量,每次只加载显示可见区域的数据,比如20条数据, 当滚动条滚动时,则重新查询数据加载新的20条数据,原来的20条数据则会被删除,也就是当前列表永远只展示20条数据。
这样实现的好处是,即使数据库中有很多数据,也不会有卡顿的现象。
但是它也有很多的弊端,它只能适用不复杂的场景,比如单选模式,对于要支持ctrl、shift、鼠标左键按下滑动选择的功能,由于当前列表只加载20条数据,Qt内置的功能只能操作这20条数据,所以需要自定义实现,如果实现不好,必然会带来很多的问题。实际上项目也确实带来了不少问题,而且也不好维护。
为此,考虑了几套解决方案,它们都有各自的优缺点。
方案一、使用QSqlTableModel来显示数据,并且一次性加载所有的数据,它的优点是能够使用Qt内置所有功能,无需自定义实现,它的缺点是加载超过20万数据的时候会有明显卡顿现象。
方案二、程序启动的时候,先预先加载一部分数据,比如1000条数据,但是随着滚动条拖动快到1000条数据的时候,则需要再加载1000条数据,并且前面已加载的数据不好销毁,这样不断的滚动,直到所有的数据都加载完成。它的优点是同样能够使用Qt内置所有功能,并且加载超过20万数据的时候也不会有卡顿现象,它的缺点是当滚动条拖动到最后的时候,会出现往上弹的现象。
方案三、列表分页显示,但是这个需要依据需求而定。
综上所述,使用QT进行界面开发的时候,尽量采用Qt支持的功能,因为自定义实现并不能做到很完善,相反,它会带来很多问题以及加大后期维护的成本。
以上三个方案个人认为不少很好,希望有高手可以提供更好的解决方案。