четверг, 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() для всех строк и получите тормоза.