所以我有这个Qt应用程序,QTreeView
带有自定义模型(派生自QAbstractItemModel
)和自定义模型代理进行过滤(派生自QSortFilterProxyModel
)。或多或少直截了当(有点类似于and works fine)并且在功能方面工作正常。
该视图显示了具有键值对的双列树。密钥很少更新,但值经常更新(很多条目每秒都有几次更新)。在代理模型中,我重载filterAcceptsRow
以根据键列定义可见性。但是每个值更改都会发出dataChanged
信号,导致视图再次调用代理(filterAcceptsRow
)并且该调用有些昂贵(评估元素及其子元素的正则表达式) )。通过缓存所有计算在filterAcceptsRow
中有一些优化空间,但最好限制对该函数的调用。它能以某种方式限制哪些列触发对代理的调用吗?
你有什么建议吗?
编辑:感谢您的意见。我不知道dynamicSortFilter
。我禁用了动态排序,并且还连接了模型中的dataChanged
- 信号,以查看键列是否已更改并在此情况下调用invalidate。这解决了它。
答案 0 :(得分:3)
如果您查看QSortFilterProxyModel
的代码,您会发现大多数工作仅在启用dynamicSortFilter
时完成。我想你的代码就是这种情况。
你可以没有它吗?也许每100次更新或第二次调用invalidate()
,具体取决于首先发生的更新。
答案 1 :(得分:1)
我有同样的问题,通过从代理模型本身而不是从主模型发出dataChanged
信号来解决它。或者,您可以禁用动态排序/过滤(dynamicSortFilter
属性),并在需要过滤或排序时手动调用它。
另外,我不确定,但也许只是在dataChanged
信号中指定列就可以为你做。