QDialog中三个带AnnotationListModel的QListView刷新缓慢求解
解决QListView勾选复选框后状态不及时刷新的问题
问题根源
你的AnnotationListModel实现互斥勾选逻辑时,修改了多个项的勾选状态,但未主动通知视图更新这些变化。QModelView架构要求模型数据变更后必须发送dataChanged信号,视图才会重新获取数据并刷新UI。原代码仅调用父类的setData,只能通知当前修改的项,其他被取消勾选的项没有触发刷新,导致状态显示延迟。
修改方案
修改setData方法,在完成数据修改后,向视图发送所有受影响项的dataChanged信号:
bool AnnotationListModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (!index.isValid()) { return false; } bool dataChanged = false; if (role == Qt::CheckStateRole) { if (value == Qt::Checked) { for (int i{ 0 }; i < m_stringList.size(); ++i) { bool oldState = m_stringList_map[m_stringList.at(i)]; bool newState = (i == index.row()); if (oldState != newState) { m_stringList_map[m_stringList.at(i)] = newState; dataChanged = true; } } sendAnnotation(m_annoType, m_stringList.at(index.row())); } else if (value == Qt::Unchecked) { bool oldState = m_stringList_map[m_stringList.at(index.row())]; if (oldState != false) { m_stringList_map[m_stringList.at(index.row())] = false; dataChanged = true; } } // 发送数据变更信号,通知视图刷新所有项的勾选状态 if (dataChanged) { QModelIndex topLeft = createIndex(0, 0); QModelIndex bottomRight = createIndex(m_stringList.size() - 1, 0); emit dataChanged(topLeft, bottomRight, {Qt::CheckStateRole}); } } return QStringListModel::setData(index, value, role); }
关键说明
dataChanged信号需指定变更的索引范围和受影响的角色:这里用topLeft到bottomRight覆盖所有行,同时指定Qt::CheckStateRole,让视图仅刷新勾选状态,减少不必要的UI更新。- 增加
dataChanged标志位,仅当实际数据发生变化时才发送信号,避免无效刷新。
内容的提问来源于stack exchange,提问作者patricxian
相关产品推荐
相关产品推荐

