c++ - 使用 QtSql.QSqlTableModel 和 QTableView 显示前几行

标签 c++ qt sqlite qt5

我试图从 SQLite 数据库文件中仅显示我的表的 5 行,我使用 QSqlTableModel 获得访问权限并使用 QTableView 在 UI 上显示。

我已经查过了,但还没有在 QSqlTableModel 或 QTableView 中找到一个函数来完成这个。有什么建议吗?

最佳答案

一个可能的解决方案是使用 setFilter("id limit 5") 但此方法将 "Where" 放在字符串之前,这会导致当我想使用 setSort() 它会在顺序中产生语法错误问题,因此我将其丢弃。

为此,我提出了以下解决方案,即创建一个继承自QSqlTableModel 的类,并覆盖selectStatement() 方法。

sqltablemodel.h

#ifndef SQLTABLEMODEL_H
#define SQLTABLEMODEL_H

#include <QSqlTableModel>

class SqlTableModel : public QSqlTableModel
{
    int mLimit;
    Q_OBJECT
public:
    SqlTableModel(QObject *parent = Q_NULLPTR, QSqlDatabase db = QSqlDatabase()): QSqlTableModel(parent, db)
    {
        mLimit = -1;
    }

    int limit() const{
        return mLimit;
    }
    void setLimit(int limit){
        if(limit > 0)
            mLimit = limit;
    }

protected:
    QString selectStatement() const
    {
        QString query = QSqlTableModel::selectStatement();
        if(mLimit > 0)
            query += QString(" LIMIT %1").arg(mLimit);
        return query;
    }
};

#endif // SQLTABLEMODEL_H

然后将 QSqlTableModel 更改为 SqlTableModel 类并使用 setLimit()

例子:

SqlTableModel *model = new SqlTableModel();
model->setTable("person");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setSort(0, Qt::DescendingOrder);
model->setLimit(5);
model->select();
//print query
qDebug()<<model->query().lastQuery();

输出:

"SELECT \"id\", \"firstname\", \"lastname\" FROM person ORDER BY person.\"id\" DESC LIMIT 5"

关于c++ - 使用 QtSql.QSqlTableModel 和 QTableView 显示前几行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45600944/

相关文章:

c - 用C模拟数据库

c++ - 尝试在 Ubuntu 上使用 pthread 时出错

c++ - 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小变得更大

qt - 带有自定义 View 小部件的 QItemDelegate

c++ - MS Windows 中的 QT 和 native OpenGL 支持

python - 使用 python 2.7.3 和 pysqlite2 2.6.3 升级 sqlite3 版本

java - SQLite 中的时间花在查询上还是 moveToNext 上?

c++ - glm 和 cxx-prettyprint,clang : call to function 'operator <<' that is neither visible in the template definition

c++ - 私有(private)成员变量作用域 - C++

c++ - 许多小部件似乎对空格键按下事件都有默认行为。如何在不子类化每个小部件的情况下覆盖它?