crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QSqlTableModel загружает не все записи, Подгрузка происходит при скролировании
FantasyOr
  опции профиля:
сообщение 16.1.2012, 16:13
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


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

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

Спасибо.
Буду очень благодарен за помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 16.1.2012, 17:14
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


База sqlite?

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

а вот QSqlTableModel что то не вижу такого метода..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 17.1.2012, 8:03
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


нет базы Oracle и MS.
попробую fetchMore и отпишусь.

Сообщение отредактировал FantasyOr - 17.1.2012, 8:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 18.1.2012, 16:41
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


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

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

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) ) т.о. если колонка затирания первая, то получается как бы дерево:

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 7.11.2024, 5:42