2017-08-09 2 views
0

QSqlTableModelを使用してアクセスし、QTableViewをUIに表示するSQLiteデータベースファイルからテーブルの5行だけを表示しようとしています。QtableViewでQtSql.QSqlTableModelを使用して最初の数行を表示

私はそれを見てきましたが、これを達成するためにQSqlTableModelまたはQTableViewのいずれかで関数を見つけていません。助言がありますか?

+0

setFilter("1) LIMIT 5;#") 

はそれがこれをgenereteます? – 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 

次にあなたがSqlTableModelクラスにQSqlTableModelを変更し、あなたが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クエリことだけが正しい、いいが短くありません:あなたは、これらの5つの要素を選択するにはどうすればよい

WHERE (1) LIMIT 5;#) 
関連する問題