【问题标题】:Implement own sort algorithm instead of QSortFilterProxyModel实现自己的排序算法而不是 QSortFilterProxyModel
【发布时间】:2021-01-13 12:18:45
【问题描述】:

我有一个使用 QSortFilterProxyModel 的表。它还负责根据用户单击的特定列对元素进行排序。现在我发现当表格显示大约 10000 个元素时,这非常慢,可能需要几秒钟。整个事情是不可重现的,这取决于列的预排序方式可能需要更长的时间 - 但并非在所有情况下都如此。

QSortFilterProxyModel 中的排序功能是一些非常奇怪的东西,其中的部分地图被排序和打乱等等......我不明白那里到底发生了什么。

所以我的想法是创建一个自己的模型,它继承自 QSortFilterProxyModel 但实现自己的排序功能 - 就像 QSortFilterProxyModel 但以更有效的方式(STL-sort-stuff 应该可以完成这项工作,因为它对我的数据非常快) .

所以我的问题是:我该怎么做?为了拥有自己的排序功能,我必须实现什么?或者有没有更好的方法来加速标准的 QSortFilterProxyModel?

谢谢!

【问题讨论】:

  • 您的模型的data() 方法如何返回值?调用速度慢了 100000 倍吗?
  • @G.M.这是一种比较方法,这对使用的排序算法有什么影响?
  • 因为它本质上允许您定义排序算法使用的比较算法——就像您可以提供自己的operator< 重载来影响类实例在@987654325 中的排序方式一样@.
  • @G.M.抱歉,我不明白:是的,它允许您替换/定义比较。但是比较只是排序算法的一小部分。当我更改比较时,这会如何影响调用该比较函数的排序算法的工作原理和效率?

标签: c++ qt qt5 model-view


【解决方案1】:

重新实现virtual QSortFilterProxyModel::sort()有什么问题?

请注意,Qt 实现已经使用 STL (std::stable_sort()) 进行实际排序。 排序的问题是您需要以某种方式获取已排序项目的源索引。这使事情变得有点复杂。如果您没有任何级联代理模型,则映射很简单,不会花费太多时间。

总结:我不认为,你会比 Qt 代码更快。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多