继续研究model/view

model/view 筛选功能 v2.0-CSDN博客

接上文


讲讲beginResetModel/endResetModel

beginResetModel()endResetModel() 是成对使用的,用于通知视图模型即将发生结构性重置

核心作用

cpp 复制代码
void MessageTableModel::clear()
{
    beginResetModel();
    // ← 这里做任意数据修改(清空、重新加载等)
    m_messages.clear();
    endResetModel();  // ← 通知视图:重置完成
}

| 作用 |
|---------------------|---------------------------------------------------|
| beginResetModel() | 告诉视图:"我马上要动大手术了,你之前拿到的所有行号、QModelIndex 全部作废,别再问了" |
| endResetModel() | 告诉视图:"手术做完了,请从头再来" |

endResetModel() 内部会触发 modelReset 信号。

为什么必须成对使用

cpp 复制代码
beginResetModel()
    ↓
视图标记所有内部缓存无效
    ↓
安全地修改底层数据(行数可能变、行号可能全换)
    ↓
endResetModel()
    ↓
视图重新查询 rowCount() → 全量刷新显示

如果中间被中断 (异常、return 等),视图会一直处于"等待结束"的状态,可能导致崩溃或白屏。

与 begin/endInsertRows 的区别

beginResetModel/endResetModel beginInsertRows/endInsertRows
开销 全量刷新 局部刷新
视图行为 重新调用 rowCount() + 所有 data() 只刷新插入区域
适用场景 数据结构完全变化 只增删几行
信号 modelReset rowsInserted