接上文
讲讲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 |