预加载和懒加载

预加载
一般用于移动端 用于图片比较多的情况 避免在项目中加载缓慢 影响用户体验 所以需要在进入项目前提前加载图片
做法是把所有图片的路径 放在一个数组中 然后使用循环遍历这个数组 每次创建一个图片对象 并把路径赋值给这个图片对象的src属性 这样就完成加载 其中使用 onload事件判断每个图片是否加载完成

懒加载
项目中图片过多的情况下 一般在可视窗口内的图片加载 可视窗口之外的图片不加载 当图片滚动进可视窗口内才让它加载
做法是可视窗口外的图片 先不给它的src属性赋值 而是把图片路径放在一个自定义属性里 当页面滚动 通过srcollTop判断图片滚动进可视窗口 把自定义属性中的路径赋值给src属性 这样就完成加载

### QTableView 数据预加载懒加载实现方式 #### 一、数据预加载 数据预加载是指在程序启动或者特定操作触发时,提前将部分或全部数据加载到内存中以便后续高效访问。对于 `QTableView` 的场景来说,可以通过以下几种方式进行优化: 1. **使用高效的 Model 实现** 继承 `QAbstractTableModel` 或其他适合的基类来自定义模型,并提供必要的接口函数支持数据存取功能[^2]。例如: - 提供 `setItemText()` `itemText()` 方法用于设置获取单元格文字。 - 使用 `setData()` `data()` 函数处理编辑角色 (`Qt::EditRole`) 及显示角色 (`Qt::DisplayRole`)。 下面是一个简单的例子展示如何通过自定义模型实现批量数据加载: ```cpp class CustomTableModel : public QAbstractTableModel { Q_OBJECT private: QVector<QVector<QString>> m_data; public: explicit CustomTableModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; void loadData(const QStringList &rows); // 预加载数据的方法 }; void CustomTableModel::loadData(const QStringList &rows) { for (const auto &rowStr : rows) { QStringList rowData = rowStr.split(","); m_data.append(rowData.toVector()); } emit dataChanged(QModelIndex(), QModelIndex()); // 刷新视图 } QVariant CustomTableModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= m_data.size()) return {}; if (role == Qt::DisplayRole) return m_data[index.row()][index.column()]; return {}; } ``` 2. **分页机制** 如果数据量较大,则可以在初始化阶段只加载前几页的数据,在滚动或其他事件发生后再动态追加更多记录。这种方式既减少了初始开销又提高了用户体验。 --- #### 二、懒加载技术 懒加载是一种按需加载的技术手段,当用户实际浏览某部分内容时才去请求对应资源并渲染出来。针对 `QTableView` 而言,主要涉及以下几个方面: 1. **重写 `data()` 方法控制延迟计算逻辑** 当调用 `data()` 查询某个索引项的信息时,如果发现该位置尚未被填充过有效值,则即时从外部源提取所需资料完成赋值过程。下面给出一段伪代码说明这一思路: ```cpp QVariant LazyLoadModel::data(const QModelIndex &index, int role) const { if (role != Qt::DisplayRole && role != Qt::EditRole) return {}; if (m_cache.contains(index)) { // 已缓存则直接返回 return m_cache.value(index); } else { // 否则执行真正的IO读取动作 QString value = fetchFromDatabase(index.row(), index.column()); m_cache.insert(index, value); return value; } } ``` 2. **结合虚拟代理模式减少不必要的实例化成本** 对于某些复杂控件(比如嵌入式图像),可以先绘制占位符代替真实对象直到确实需要查看它们为止。具体做法可参见如下片段: ```cpp QWidget* ImageDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (!isImageLoaded(index)) loadThumbnailAsync(index); QLabel *label = new QLabel(parent); label->setPixmap(getCachedPixmap(index)); return label; } ``` 3. **利用信号槽监听垂直滚动条变化调整可见区域范围内的项目更新频率** 此外还可以借助 `verticalScrollBar()->valueChanged(int)` 来捕获用户的上下拖拽行为从而决定何时重新评估哪些行应当处于激活状态之下进而触发相应的网络下载任务等等[^3]^。 --- ### 总结 无论是采用何种策略都需要综合考虑目标平台硬件性能指标以及最终呈现效果之间的平衡关系。以上介绍了一些常见的关于 `QTableView` 中应用数据预加载懒加载相结合的最佳实践经验希望能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值