我试图从SQLite数据库文件,我用QSqlTableModel获得访问和QTableView显示在用户界面上显示我的表只有5行。显示前几行使用QtSql.QSqlTableModel与QTableView
我已经查阅了它,但是还没有在QSqlTableModel或QTableView中找到一个函数来实现这个功能。有什么建议么?
我试图从SQLite数据库文件,我用QSqlTableModel获得访问和QTableView显示在用户界面上显示我的表只有5行。显示前几行使用QtSql.QSqlTableModel与QTableView
我已经查阅了它,但是还没有在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"
当您使用使用setfilter( “LIMIT 5”),其产生与此类似:
WHERE (LIMIT 5)
这是完全错误的。刚刚与selectStatement()检查一下,你会看到。
也许这招是不是很好,但更短,只是正确的,SQL查询一点点SQL注入:
setFilter("1) LIMIT 5;#")
它将generete这样的:
WHERE (1) LIMIT 5;#)
你如何选择这五个要素? – eyllanesc
对不起,我忘了提。我的日期列进行排序他们,并挑选前5分最近的人。 –