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

QAbstractItemModel::sort是否通知视图?自定义实现的信号责任归属

关于QAbstractItemModel::sort()重写后视图更新的问题

明确结论:重写sort()函数时,必须由你在函数内部负责通知视图数据已更新,调用者不会处理这件事。

原因很直接:Qt内置模型(比如QStandardItemModel)的默认sort()实现,会在排序完成后自动发射layoutChanged或dataChanged信号触发视图刷新,但当你完全自定义排序逻辑时,框架无法感知你的数据结构何时、如何发生变化,因此需要手动触发对应的更新信号。

具体实现参考:

  • 如果排序后模型项的整体顺序发生改变(比如行的排列顺序完全重排),发射layoutChanged()信号,告知视图重新计算所有项的位置。
  • 如果仅部分数据内容更新,可发射dataChanged()信号并指定变化的范围。

示例代码:

void MyCustomModel::sort(int column, Qt::SortOrder order) {
    // 自定义排序逻辑,对内部数据源进行排序
    std::sort(m_data.begin(), m_data.end(), [column, order](const Item& a, const Item& b) {
        if (order == Qt::AscendingOrder) {
            return a.value(column) < b.value(column);
        } else {
            return a.value(column) > b.value(column);
        }
    });

    // 发射信号通知视图更新
    emit layoutChanged();
}

若不发射此类信号,视图会持续显示排序前的旧数据,因为它无法感知模型内部的变化。

内容的提问来源于stack exchange,提问作者Dawn Wren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:57:03