QT分页使用QSqlQueryModel

QT paging using QSqlQueryModel

我正在寻找使用 QSqlQueryModel 创建分页的解决方案。

我遇到的问题是我想使用分页从 sql 数据库文件中提取数据,为此我选择了 QSqlQueryModel。但现在的问题是我无法控制它将获取多少条记录。

基本上,如果数据库中有 1000 条记录,我只想最初获取 20 个条目,然后在另一个调用中再获取 20 个条目,然后在另一个调用中再获取 20 个条目,依此类推。怎么做?

到目前为止代码是

QSqlQueryModel *model = new QSqlQueryModel;
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("/Users/xyz/events.db");

if (db.isValid())
{
    db.open();
    if (db.isOpen())
    {
        model->setQuery("select * from events");

        qDebug() << "I m Working";
        QSqlRecord rec = model->record(0);
        qDebug() << rec;
        qDebug() << model->canFetchMore();

        db.close();

    } else {
        qDebug() << "DB is not open";
    }
} else {
    qDebug() << "DB is not valid";
}

QSqlQueryModel 中有 canFetchMore() 函数。因此,如果 setQuery 获取所有数据,那么它总是错误的,而不是如何调整它,我可以使用 fetchmore() 以受控方式获取更多数据。

谢谢

你想要的是pagination/paging,不是吗? 来自 https://doc.qt.io/qt-5/qsqlquerymodel.html#details

QSqlQueryModel 是执行SQL 语句和遍历结果集的高级接口。它建立在较低级别的QSqlQuery之上,可以用来提供数据给视图类比如QTableView

sqlite 中有分页问题。 Efficient paging in SQLite with millions of records

和sqlhttps://docs.microsoft.com/en-us/previous-versions/sql/compact/sql-server-compact-4.0/gg699618(v=sql.110)?redirectedfrom=MSDN

如果您想知道 QSqlQueryModel 是如何工作的,您应该查看 source code。 class 处理(应该处理)开箱即用的部分提取,您不需要实现自己的机制。
基本上,如果视图由于向下滚动而需要显示更多项目,模型会获取另一组(根据实现为 255)行并将它们附加到底部。

基本上所有模型都旨在提供性能高效的抓取。主要思想是视图在需要显示时立即从其模型请求更多数据。如果您有 1000 个数据项并且视图无法一次显示它们,则不需要全部 1000 个。如果您调试模型,您将看到 QAbstractItemModel::data() 函数是如何调用的以及使用哪些参数:仅可见提供模型索引。