QTableView не показывает все данные из базы данных SQLite - PullRequest
0 голосов
/ 04 мая 2018

У меня есть простое приложение с QTableView и QLineEdit , и я использую QSqlQueryModel и QSortFilterProxyModel для получения данных из таблицы в базе данных SQLite3 и отфильтруйте результаты (с помощью setFilterFixedString (текст из QLineEdit) ). Таблица в базе данных имеет 8611 строк.

При первой загрузке табличное представление не отображает все строки в базе данных. Когда я применяю строку к фильтру (помещаю некоторый текст в QLineEdit), отображаются не все ожидаемые результаты; Я должен удалить текст из QLineEdit и прокрутить вниз до конца таблицы (он обновляется из базы данных ?!), а затем проблема исчезает: у меня есть все результаты, как из базы данных.

Это известная ошибка в QTableView? Как решить эту проблему?

Спасибо.

P.S .: это основные части моего заявления, касающиеся этой проблемы.

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 Ответ

0 голосов
/ 04 мая 2018

Оказалось, что драйвер SQLite Qt вставляет строки в модель с шагом 256 строк. Мне пришлось получить все результаты с помощью fetchMore () .

while(model->canFetchMore()) model->fetchMore();

См. Здесь и здесь .

...