" />
Qt:使用Model | 您所在的位置:网站首页 › qtreeview加载大量数据 › Qt:使用Model |
#include "MyModel.h" #include
MyModel::MyModel(int rowCount, int pageSize, QObject *parent) : QAbstractTableModel(parent) { this->m_pageSize = pageSize; this->m_rowCount = rowCount; }
int MyModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent);
return 1; // 以一列为示例, 如果是多列, 则data list保存的应该是对象 }
int MyModel::rowCount (const QModelIndex &parent) const { Q_UNUSED(parent); return m_rowCount; }
QVariant MyModel::data( const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); }
if (Qt::DisplayRole == role) { int i = indexOfRow(index.row()); return m_dataList.at(i); }
return QVariant(); }
int MyModel::indexOfRow(int row) const { int page = row / m_pageSize; // 每页显示pageSize条记录
if (!m_pageHash.contains(page)) { // 如果此面的数据不存在, 则读取数据到 data list里 (const_cast(this))->fetchData(page); }
return m_pageHash.value(page) + row % m_pageSize; }
// 每次加载数据时,如果是耗时任务, 可以使用进度条显示加载进度 // 也可以取消加载, 但是这个时候data()函数中返回一个非有效的index void MyModel::fetchData(int page) { int pageStartIndex = m_dataList.count(); // 存储此页码与其所对应的开始下标值 m_pageHash.insert(page, pageStartIndex);
// 例如在这里使用分页查询, 从数据库里读取数据 for (int i = 0; i < m_pageSize; ++i) { int data = page * m_pageSize + i; m_dataList.append(data);
// 快速拖动滚动条, 可以看到中间很多没必要的数据没有产生. qDebug() |
CopyRight 2018-2019 实验室设备网 版权所有 |