如何滚动到 QTableView 中 Sqlite 模型的最后一行?

Posted

技术标签:

【中文标题】如何滚动到 QTableView 中 Sqlite 模型的最后一行?【英文标题】:How to scroll to last row of a Sqlite model in a QTableView? 【发布时间】:2013-02-15 04:45:46 【问题描述】:

我有一个连接到 QTableView 的 1000 行的 Sqlite 模型。我可以查看 QTableView 中的行,但是当我滚动到 QTableView 的底部时,我只能到达前 100 行的末尾。如果我继续拉动滚动条按钮,新行会附加到视图中,但我无法轻松滚动到最后。一旦所有行都附加到视图中,我就可以轻松地从上到下滚动而不会出现问题。

这是代码的重要部分(只是标准):

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)

我一定遗漏了一些非常简单的东西。有什么建议吗?

劳伦斯。

【问题讨论】:

【参考方案1】:

QSqlTableModel 延迟加载数据,即它会在请求时加载项目。 QTableView 会询问是否需要显示项目。您观察到的延迟是 QSqlTableModel 从数据库中获取新数据的部分。

还有an issue,如果SQL驱动不报告查询大小,SQLite就是其中之一:

如果数据库没有返回查询中选定的行数, 该模型将增量获取行。有关更多信息,请参见 fetchMore() 信息。

所以模型实际上并不知道会有多少项目直到它加载所有项目。

为了消除延迟,您应该预先加载所有数据(如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)

【讨论】:

完美!正是我需要做的。

以上是关于如何滚动到 QTableView 中 Sqlite 模型的最后一行?的主要内容,如果未能解决你的问题,请参考以下文章

Qtableview滚轮缩放

如何在QTableView Qt C ++中将sqlite db数据显示为多列视图?

底层模型更改时如何在 QTableView 中禁用自动滚动到顶部?

滚动大型数据集时,PyQt QTableView 速度非常慢

如何防止 QAbstractScrollArea / QTableView 水平滚动?

一个 QTableView 中的两个表