【发布时间】:2015-01-19 21:18:48
【问题描述】:
我正在使用 PyQt 并在 QTableView 中显示数据表。我只是在寻找一种方法来避免在屏幕上出现不超过 100 行时将整个数据集调用到内存中。从理论上讲,如果我只是检索可见数据,我应该能够几乎立即浏览包含数十万条记录的表。
据我了解,当 QTableView 想要显示一个数据单元格时,它会调用我的表模型(它是 QAbstractTableModel 的子类)的“data()”函数。该函数接收应该显示的单元格的行和列索引。如果我已经加载了我需要的所有数据,这对我来说非常有用。
但是,如果我还没有所有数据,我是否必须对每个单元格进行查询?还有另一种方法可以做到这一点吗?也许有一种方法可以逐行而不是逐个单元格地获取数据。也许有一个针对 MySql 的特定于数据库的解决方案,这就是我们正在使用的。
【问题讨论】:
-
为什么不使用QSqlTableModel?
-
是否只加载可见的内容?很高兴知道,我会对此进行研究,但我非常想了解如何使用 QAbstractTableModel (其中 QSqlTableModel 是一个子类)来实现这一点。我没有在我的问题中提到这一点,但我可能需要对大型 CSV 文件执行相同的操作,因为我不想将整个文件加载到内存中。
-
我没有任何使用它的个人经验,但它肯定比在 PyQt 中实现的自定义模型要快。如果您想详细了解它是如何完成的,您可能必须阅读相关的 Qt 源代码。或者要获得更一般的指导,请尝试Model subclassing reference。
-
好吧,我拒绝 QSqlTableModel 做任何不寻常的事情。并不是渲染行对我来说很慢。我只是想找出一种方法来从视图中进行适当的数据库调用。这是一个足够通用的问题,我希望有某种通用的解决方案。
-
我的意思是子类化
QSqlTableModel可能比基于QAbstractTableModel从头开始编写整个东西更高效。但就像我说的,我并没有真正使用过它,所以也许没有那么多收获。