Ранее я писал про извращения с наследником 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() для всех строк и получите тормоза.
Здравствуйте, я тоже делаю модель. Даю совет, лучше при рефреше посчитать кол-во строк("SELECT COUNT(ID) FROM TABLE"), сохранить в переменную, а в rowCount выводить эту переменную, ибо при скроллинге, постоянно запрашивает rowCount. Из-за бд sqlite, нельзя сделать query.size(). При 10тыс записях у меня подтормаживал скроллинг, после, как я сделал возврат переменной, а не запрос, все очень гладко :)
ОтветитьУдалитьСоздал 600 тыс записей, чуть чуть подтормаживала прогрузка, при скроллинге до конца, 78 мб оперативной памяти, после, опять очень гладкий скроллинг :)
ОтветитьУдалить