2017-08-09 99 views
0

我试图从SQLite数据库文件,我用QSqlTableModel获得访问和QTableView显示在用户界面上显示我的表只有5行。显示前几行使用QtSql.QSqlTableModel与QTableView

我已经查阅了它,但是还没有在QSqlTableModel或QTableView中找到一个函数来实现这个功能。有什么建议么?

+0

你如何选择这五个要素? – eyllanesc

+0

对不起,我忘了提。我的日期列进行排序他们,并挑选前5分最近的人。 –

回答

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" 
0

当您使用使用setfilter( “LIMIT 5”),其产生与此类似:

WHERE (LIMIT 5) 

这是完全错误的。刚刚与selectStatement()检查一下,你会看到。

也许这招是不是很好,但更短,只是正确的,SQL查询一点点SQL注入:

setFilter("1) LIMIT 5;#") 

它将generete这样的:

WHERE (1) LIMIT 5;#)