我有一个连接到QTableView的几千行的sqlite模型.我可以在QTableView中查看行,但是当我滚动到QTableView的底部时,我只能到达前几百行的末尾.如果我继续拉动滚动条按钮,新行会附加到视图中,但我无法轻松滚动到结尾.将所有行附加到视图后,我可以轻松地从上到下滚动而不会出现问题.
这是代码的重要部分(只是标准):
self.db = Qtsql.QsqlDatabase.addDatabase("QsqlITE") self.db.setDatabaseName(dbFileName) self.model = Qtsql.QsqlTableModel(self.db) self.model.setTable("results") self.model.select() self.tableViewResults.setModel(self.model)
我必须错过一些非常简单的事情.有什么建议?
劳伦斯.
解决方法
QsqlTableModel懒惰加载数据,即它会在要求时加载项目.如果需要显示项目,QTableView会询问项目.您观察到的延迟是QsqlTableModel从数据库中获取新数据的部分.
还有an issue,如果sql驱动程序没有报告查询大小,sqlite就是其中之一:
If the database doesn’t return the number of selected rows in a query,
the model will fetch rows incrementally. See fetchMore() for more
information.
因此,在加载所有项目之前,模型实际上不知道将有多少项目.
为了消除延迟,您应该事先加载所有数据(如fetchMore
所示):
self.db = Qtsql.QsqlDatabase.addDatabase("QsqlITE") self.db.setDatabaseName(dbFileName) self.model = Qtsql.QsqlTableModel(self.db) self.model.setTable("results") self.model.select() while self.model.canFetchMore(): self.model.fetchMore() self.tableViewResults.setModel(self.model)