5

QTableView に接続された数千行の 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)

非常に単純なものが欠けているに違いありません。助言がありますか?

ローレンス。

4

1 に答える 1

6

QSqlTableModelデータを遅延ロードします。つまり、要求されたときにアイテムをロードします。また、アイテムを表示QTableViewする必要がある場合は、アイテムを要求します。あなたが観察するその遅延は、データベースから新しいデータを取得する部分です。QSqlTableModel

また、SQL ドライバーがクエリ サイズを報告せず、SQLite がその 1 つである場合、問題もあります。

データベースがクエリで選択された行数を返さない場合、モデルは行を段階的にフェッチします。詳細については、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)
于 2013-02-15T05:14:31.183 に答える