gpt4 book ai didi

QTableView + 自定义 TableModel + 延迟加载

转载 作者:行者123 更新时间:2023-12-04 13:12:42 30 4
gpt4 key购买 nike

我需要将繁重的数据集加载到 QTableView 中。数据集在内存中不小于 700Mb,我不想将其全部加载到内存中。

QSqlQueryModel 对我来说并不理想,原因有两个 - 它不可编辑,也不是真正的按需加载(因为将整个数据提取到内存中)。

我想得到什么

  • 我只想将部分数据存储在内存中。只为
    显示,也许还有一些用于快速滚动的缓冲区。
  • 模型应该是可编辑的
  • 应该是低内存消耗
  • 应该没有卡住

  • 我是如何解决这个问题的 (我的代码的简单模型)
  • 自定义QTableView(tableView)
  • 自定义 TableModel(型号)
  • 模型包装。 (包装)

  • 模型包装器从数据库中选择行数,并将此值设置为模型。现在模型可以回答 int rowCount()。

    为 tableView.verticalScrollBar() 设置了相同的值。

    tableView.verticalScrollBar 信号(valueChanged) 连接到tableview slot(on_valueChanged)

    部分代码
    tableView::on_valueChanged(value)
    {
    wrapper.changeOffset(value);
    }

    wrapper::changeOffset(value)
    {
    if (_offset == value){
    return;
    }

    _selectQuery->seek(value);
    int endValue = qMin(value + _cacheSize, model->rowCount());
    _list.clear();
    for(int i = value; i < endValue-1; i++){
    _list.append(_selectQuery->record());
    }
    model->setRecordList(_list);
    _offset = value;
    model->setOffset(_offset);

    }

    wrapper::changeOffset 中的 _selectQuery 是之前为选择查询结果执行的 QSqlQuery 游标。

    我还在模型中实现了几种方法
    QVariant SqlRecModel::data(const QModelIndex &index, int role) const
    {
    int row = index.row() - _offset;
    if (row > m_recList.size() || row < 0){
    return QVariant();
    }
    if (role == Qt::DisplayRole)
    {
    QVariant value = m_recList.at(row).value(index.column());
    return value;
    }
    return QVariant();
    }

    模型数据存储的 setter
    void SqlRecModel::setRecordList(const QList<QSqlRecord> &records)
    {
    qDebug() << "r:";
    emit layoutAboutToBeChanged();
    m_recList = records;
    emit layoutChanged();
    }

    问题

    我可以滚动 _cacheSize 行,但在退出旧的 cacheRange 后我会崩溃(程序已意外完成。)。

    有什么建议吗?我不知道在哪里挖。谢谢!

    最佳答案

    对不起打扰。

    错误在其他代码块中。

    这种方式可以解决我的任务。

    顺便说一句:如果您使用缓存缓冲区,您可以实现更流畅的滚动。

    关于QTableView + 自定义 TableModel + 延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28188377/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com