You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:27:07