QTableView не показывает все данные из базы данных SQLite
У меня есть простое приложение с QTableView и QLineEdit, и я использую QSqlQueryModel и QSortFilterProxyModel, чтобы получить данные из таблицы в базе данных SQLite3 и отфильтровать результаты (с помощью setFilterFixedString(текст из QLineEdit)). Таблица в базе данных составляет 8611 строк.
При первой загрузке табличное представление не отображает все строки в базе данных. Когда я применяю строку к фильтру (помещаю некоторый текст в QLineEdit), отображаются не все ожидаемые результаты; Я должен удалить текст из QLineEdit и прокрутить вниз до конца табличного представления (он обновляется из базы данных?!), тогда проблема исчезает: у меня есть все результаты, как из базы данных.
Это известная ошибка с QTableView? Как решить эту проблему?
Спасибо.
PS: это основные части моего приложения, касающиеся этой проблемы.
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QtSql>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_searchEdit_textChanged(const QString &arg1);
private:
Ui::MainWindow *ui;
QSqlQueryModel *model;
QSortFilterProxyModel *proxyModel;
};
#endif // MAINWINDOW_H
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("dpm.db");
if (!db.open()) { }
model = new QSqlQueryModel(this);
model->setQuery(QString("SELECT specialite as Spécialité, dci as DCI FROM medocs"), db);
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
ui->listeTable->setModel(proxyModel);
ui->listeTable->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_searchEdit_textChanged(const QString &medoc)
{
proxyModel->setFilterFixedString(medoc);
}
1 ответ
Оказалось, что драйвер SQLite Qt вставляет строки в модель с шагом 256 строк. Мне пришлось получить все результаты с fetchMore ().
while(model->canFetchMore()) model->fetchMore();