我試圖從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分最近的人。 –