【问题标题】:Qt ProxyModel performance problemsQt ProxyModel 性能问题
【发布时间】:2017-10-17 03:08:37
【问题描述】:

所以我有一个带有QTreeView 的Qt 应用程序,带有一个自定义模型(源自QAbstractItemModel)和一个用于过滤的自定义模型代理(源自QSortFilterProxyModel)。或多或少直截了当(有点类似于and works fine)并且在功能方面工作得很好。

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

你对我有什么建议吗?

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

【问题讨论】:

  • 所以,总结一下:您不希望每次数据更改都会导致模型被重新过滤?那么你想如何触发过滤呢?无论如何,我会深入研究 Qt 源代码,找到实际调用 filterAcceptsRow 的位置,看看代码中是否有任何可以帮助您的内容。
  • 我不这么认为,因为filterAcceptsRow 可以任意定义,包括查看其他行。我认为您将更改 QSortFilterProxyModel 本身的代码。
  • 如果您的代码是/可以是 GPL,或者如果您有商业 Qt 许可证,那么您只需将 QSortFilterProxyModel 的代码复制到您的应用程序代码中,然后进行修改。如果您决定这样做,请确保您了解这两种情况下的许可含义。另一种方法是自己从头开始实现相当于QSortFilterProxyModel(可能不是太大的任务)。
  • @hyde 应该是由key列的改变触发的。

标签: qt c++11 qt5


【解决方案1】:

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

没有它你能活吗?可能每 100 次更新或每秒调用一次 invalidate(),具体取决于哪个先发生。

【讨论】:

    【解决方案2】:

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

    另外,我不确定,但也许只需在dataChanged 信号中指定列即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2022-01-04
      • 2011-08-03
      相关资源
      最近更新 更多