在Qt中,我有一个模型子类QAbstractItemModel
-这是一个QTreeView则显示一棵树。
该模型支持各种形式的变化,所有工作确定。 这两个密切相关的有:
1)在一个小数目相关行的一些数据变化
2)的可视化的变化意味着大多数行应该改变其格式 - 特别是它们具有高亮背景的变化。 他们DisplayRole
数据不会改变。
目前的设计涉及这两个以同样的方式:对于没有任何改变每一行的模型发出dataChanged(start_of_row_index,end_of_row_index)
我发出信号,为改变两个上级行和任何他们的孩子已经改变。
然而,这在情况2中作为模型表现不好得到大:非常大量的dataChanged
信号被发射。
使得在壳体2中的模型发出我已经改变的代码dataChanged
仅对于(单)行即整个树的父。
这似乎仍然能够正常工作,但不同意我的模型的责任的理解一致。 但我怀疑我可能是错的。
也许我误解的dataChanged
信号? 它实际上会导致更新所有儿童的观点以及在规定的范围内? 或者,我可以避开发射dataChanged
当它不是DisplayRole
这种情况正在改变?
与我的进步主编至今
正如扬指出,我应该发出dataChanged
无论是在案件2大部分或全部行。
我的代码最初做这个通过发射dataChanged
为每个更改的行,但这是太贵了-认为时间太长处理所有这些信号。
一种可能的解决方案可以是聚集dataChanged
为更改的行中的任何连续的块信号,但是当,例如,每隔一行已经改变,这将仍然没有表现良好-它仍将发射太多的信号。
理想情况下,我想只是告诉视图考虑为潜在更改的所有数据(依然有效,但所有指标 - 布局不变)。 这似乎并不可能有一个信号。
由于的怪癖QTreeView
类,它是可能的(虽然不正确,根据该规范)仅发射一个dataChanged(tl,br
),只要tl != br
。 我有这个工作,它通过了我们的测试,但留给我的紧张。
我现在已经解决了上横穿树并发出一个版本dataChanged(tl,br)
对每一个家长(与TL,BR跨越该父的所有子)。 这符合模型/视图协议和我们的模型它通常由大约10的因子减小的信号的数目。
这似乎并不理想不过。 任何其他建议任何人吗?