четверг, 21 апреля 2016 г.

Снова по прокрутке большой БД

Возвращаюсь к теме просмотра большой БД в виде одной большой таблицы QTableView.
Ранее я писал про извращения с наследником QTableView, теперь будем делать это каноничнее.
Итак, есть большая БД, на 100 килострок минимум. Какая БД неважно, FireBird, SQLite и т.п.

Первое, что надо сделать это определить модель.
class QueryModel : public QAbstractTableModel
и определить в ней rowCount(). rowCount() определяется так:
"SELECT COUNT(ID) FROM TABLE"

Затем в классе определяем экземпляр QSqlQuery query_, которому говорим SELECT * FROM TABLE, условно.

Далее определяем data()
QVariant QueryModel::data(const QModelIndex & index, int role) const
{
   if (role == Qt::DisplayRole)
   {
      if (query_->seek(index.row()))
      {
         const QSqlRecord & rec = query_->record();
         QVariant val = rec.value(index.column());
         QString str = val.toString();
         return str;
      }
   }
}

Всё. Этого достаточно чтобы иметь нормально прокручиваемую таблицу.
Небольшое дополнение, не нужно вызывать функции resizeColumnsToContents() и resizeRowsToContents(), это вызовет метод data() для всех строк и получите тормоза.

2 комментария:

  1. Здравствуйте, я тоже делаю модель. Даю совет, лучше при рефреше посчитать кол-во строк("SELECT COUNT(ID) FROM TABLE"), сохранить в переменную, а в rowCount выводить эту переменную, ибо при скроллинге, постоянно запрашивает rowCount. Из-за бд sqlite, нельзя сделать query.size(). При 10тыс записях у меня подтормаживал скроллинг, после, как я сделал возврат переменной, а не запрос, все очень гладко :)

    ОтветитьУдалить
  2. Создал 600 тыс записей, чуть чуть подтормаживала прогрузка, при скроллинге до конца, 78 мб оперативной памяти, после, опять очень гладкий скроллинг :)

    ОтветитьУдалить