使用带有QTableView的QtSql.QSqlTableModel显示前几行

时间:2017-08-09 21:32:12

标签: c++ qt sqlite qt5

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

我查了一下但是在QSqlTableModel或QTableView中找到了一个函数来完成这个任务。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用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"

答案 1 :(得分:0)

当您使用setFilter(&#34; LIMIT 5&#34;)生成与此类似的内容时:

WHERE (LIMIT 5)

哪个是完全错误的。只需使用selectStatement()进行检查,您就会看到。

也许这个技巧不是很好但是更短,只需用一点SQL注入来纠正Sql查询:

setFilter("1) LIMIT 5;#")

它会生成这个:

WHERE (1) LIMIT 5;#)