我正在尝试从SQLite数据库文件中仅显示我的表格的5行,我使用QSqlTableModel获取访问权限,并在UI上显示QTableView。
我查了一下但是在QSqlTableModel或QTableView中找到了一个函数来完成这个任务。有什么建议吗?
答案 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;#)