2017-08-09 36 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;#)