【发布时间】: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列的改变触发的。