Qt C++中如何获取QSortFilterProxyModel排序后的前5项?
问题原因
你遇到的问题核心在于:filterAcceptsRow里判断的是源模型的行号,但QSortFilterProxyModel的排序操作不会改变源模型的行顺序,所以你过滤出来的是源模型未排序状态下的前5行,而非代理排序后的结果。
正确实现思路
要获取代理模型排序后的前5项,不能通过过滤源行号实现,而是应该在代理模型完成排序后,限制代理模型对外暴露的行数,具体可以通过重写rowCount方法:
- 先在
setSourceModel中完成父类调用和排序设置,确保代理模型基于源模型完成排序 - 重写
rowCount,返回代理模型实际行数与5的较小值,让外部只能获取到排序后的前5行
代码示例
class Top5SortedProxyModel : public QSortFilterProxyModel { Q_OBJECT public: explicit Top5SortedProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {} void setSourceModel(QAbstractItemModel *sourceModel) override { QSortFilterProxyModel::setSourceModel(sourceModel); // 按第1列排序(注意Qt列索引从0开始,若你指的是界面显示的第1列,这里用0) sort(0, Qt::AscendingOrder); } int rowCount(const QModelIndex &parent = QModelIndex()) const override { // 返回排序后代理模型的前5行,若总行数不足5则返回实际行数 return qMin(QSortFilterProxyModel::rowCount(parent), 5); } // 无需重写filterAcceptsRow,除非还有其他过滤需求 };
额外说明
- 如果需要动态调整获取的行数(比如不是固定5),可以给代理模型添加
setTopRowCount方法,保存目标行数后调用beginResetModel()和endResetModel()触发界面更新 sort方法调用后,代理模型会自动完成排序并更新数据,rowCount会基于排序后的结果计算
内容的提问来源于stack exchange,提问作者Capurnie
相关产品推荐
相关产品推荐

