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
相关产品推荐
相关产品推荐

