首页 > 解决方案 > 使用 QSqlQueryModel 进行 QT 分页

问题描述

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

我遇到的问题是我想使用分页从 sql db 文件中提取数据,为此我选择了 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() 以受控方式获取更多数据。

谢谢你

标签: c++qtqt5qtsql

解决方案


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

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


推荐阅读