Qt ProxyModel性能问题

时间:2017-05-17 15:01:44

标签: qt c++11 qt5

所以我有这个Qt应用程序,QTreeView带有自定义模型(派生自QAbstractItemModel)和自定义模型代理进行过滤(派生自QSortFilterProxyModel)。或多或少直截了当(有点类似于and works fine)并且在功能方面工作正常。

该视图显示了具有键值对的双列树。密钥很少更新,但值经常更新(很多条目每秒都有几次更新)。在代理模型中,我重载filterAcceptsRow以根据列定义可见性。但是每个更改都会发出dataChanged信号,导致视图再次调用代理(filterAcceptsRow)并且该调用有些昂贵(评估元素及其子元素的正则表达式) )。通过缓存所有计算在filterAcceptsRow中有一些优化空间,但最好限制对该函数的调用。它能以某种方式限制哪些列触发对代理的调用吗?

你有什么建议吗?

编辑:感谢您的意见。我不知道dynamicSortFilter。我禁用了动态排序,并且还连接了模型中的dataChanged - 信号,以查看键列是否已更改并在此情况下调用invalidate。这解决了它。

2 个答案:

答案 0 :(得分:3)

如果您查看QSortFilterProxyModel的代码,您会发现大多数工作仅在启用dynamicSortFilter时完成。我想你的代码就是这种情况。

你可以没有它吗?也许每100次更新或第二次调用invalidate(),具体取决于首先发生的更新。

答案 1 :(得分:1)

我有同样的问题,通过从代理模型本身而不是从主模型发出dataChanged信号来解决它。或者,您可以禁用动态排序/过滤(dynamicSortFilter属性),并在需要过滤或排序时手动调用它。

另外,我不确定,但也许只是在dataChanged信号中指定列就可以为你做。