Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QSqlTableModel загружает не все записи
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
FantasyOr
Здравствуйте.
Описываю ситуацию:
Есть таблица в БД в ней 100500 тыщ записей.
Просмотр этой таблицы через связку QSqlTableModel-> QxtSortFilterProxyModel-> QTableView .
Сделал панельку множественного фильтра(QTableView с одной строкой и делегатом QComboBox ) и разместил сверху шапки таблицы. QComboBox'ы заполняю из QxtSortFilterProxyModel и всё круто, но QSqlTableModel загружает всего 256 строк, остальные подгружаются только по мере скроллирования таблицы, соответственно и данные в QComboBox'ах не полные.

Подскажите как можно приказать QSqlTableModel загрузить сразу все записи. Понимаю, что при 100500 тыщах записей будет лагать, но тут я уже придумал схему: можно в другом потоке постепенно загружать все данные и заполнять ими QComboBox'ы, всё равно пользователь не кинется в первую секунду сортировать по всем колонкам одновременно, это уже не важно. Повторюсь главное заставить QSqlTableModel загрузить сразу все записи, даже если нужно будет наследоваться не беда.

Спасибо.
Буду очень благодарен за помощь.
512es
База sqlite?

QSqlQueryModel умеет делать это так:
while (canFetchMore()) fetchMore();

а вот QSqlTableModel что то не вижу такого метода..
FantasyOr
нет базы Oracle и MS.
попробую fetchMore и отпишусь.
FantasyOr
Да всё шикарно работает:

главное запомнить, что модель не потоко-безопасна.

setQuery(QString _value)
{
// в ГУИ потоке создаю(new) и заполняю(запросом) модель1
    FModel->clear();
    FModel->setQueryText(_value);
    FMultiProxyModel.setSourceModel(FModel);    

// создаю новый поток
    TFullFillModelThread *ffm = new TFullFillModelThread();
// соединяю     
              QObject::connect(ffm, SIGNAL(takeFullMode(TTreeTableModel *, QObject *)),
                    this, SLOT(setFullModel(TTreeTableModel *, QObject *)) );
    ffm->run();
    ...
}


void
setFullModel(TTreeTableModel *_value, QObject *_thread)
{
    FMultiProxyModel.setSourceModel(_value);

    FModel->disconnect();
    FModel->deleteLater();

    _thread->disconnect();
    _thread->deleteLater();
}




ран потока, в приципе кроме него только передача текста запроса
    void run()
    {
        TTreeTableModel *model = new TTreeTableModel();
        model->setQueryText(_qt);
        qDebug() <<tr("загружаем всю таблицу");
        while (model->canFetchMore())
            { model->fetchMore();
        qDebug() <<tr("новая порция");}
        qDebug() <<tr("таблица закончилась");


        
        emit takeFullModel(model, this);
        exec();        
    }



почему TTreeTableModel когда писал о QTableView: переопределён метод data так, что возвращает "" у DisplayRole if ( cell(i, x) == cell(i-1, x) ) т.о. если колонка затирания первая, то получается как бы дерево:



Да всё шикарно работает:

главное запомнить, что модель не потоко-безопасна.

setQuery(QString _value)
{
// в ГУИ потоке создаю(new) и заполняю(запросом) модель1
    FModel->clear();
    FModel->setQueryText(_value);
    FMultiProxyModel.setSourceModel(FModel);    

// создаю новый поток
    TFullFillModelThread *ffm = new TFullFillModelThread();
// соединяю     
              QObject::connect(ffm, SIGNAL(takeFullMode(TTreeTableModel *, QObject *)),
                    this, SLOT(setFullModel(TTreeTableModel *, QObject *)) );
    ffm->run();
    ...
}


void
setFullModel(TTreeTableModel *_value, QObject *_thread)
{
    FMultiProxyModel.setSourceModel(_value);

    FModel->disconnect();
    FModel->deleteLater();

    _thread->disconnect();
    _thread->deleteLater();
}




ран потока, в приципе кроме него только передача текста запроса
    void run()
    {
        TTreeTableModel *model = new TTreeTableModel();
        model->setQueryText(_qt);
        qDebug() <<tr("загружаем всю таблицу");
        while (model->canFetchMore())
            { model->fetchMore();
        qDebug() <<tr("новая порция");}
        qDebug() <<tr("таблица закончилась");


        
        emit takeFullModel(model, this);
        exec();        
    }



почему TTreeTableModel когда писал о QTableView: переопределён метод data так, что возвращает "" у DisplayRole if ( cell(i, x) == cell(i-1, x) ) т.о. если колонка затирания первая, то получается как бы дерево:

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.