QSqlTableModelを使用してアクセスし、QTableViewをUIに表示するSQLiteデータベースファイルからテーブルの5行だけを表示しようとしています。QtableViewでQtSql.QSqlTableModelを使用して最初の数行を表示
私はそれを見てきましたが、これを達成するためにQSqlTableModelまたはQTableViewのいずれかで関数を見つけていません。助言がありますか?
QSqlTableModelを使用してアクセスし、QTableViewをUIに表示するSQLiteデータベースファイルからテーブルの5行だけを表示しようとしています。QtableViewでQtSql.QSqlTableModelを使用して最初の数行を表示
私はそれを見てきましたが、これを達成するために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
次にあなたが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"
あなたはこれと似たような生成のSetFilter( "LIMIT 5")を使用します。
WHERE (LIMIT 5)
完全に間違っています。 selectStatement()でチェックするだけです。
たぶん、このトリックは少しSQLインジェクションとSQLクエリことだけが正しい、いいが短くありません:あなたは、これらの5つの要素を選択するにはどうすればよい
WHERE (1) LIMIT 5;#)
:
はそれがこれをgenereteます? – eyllanesc
申し訳ありません。私は日付の列でそれらを並べ替え、最初の5つの最近のものを選びます。 –