嗨,Stackoverflow 中的所有 Qt 模型/视图编程大师。我正在进行的项目需要我为 XML 数据定义一个 QAbstractItemModel 派生模型。之前在实现这个模型的过程中遇到问题的时候在这里问过一个问题: QSortFilterProxyModel crash when delete a row from source model via source model function
除了一些我不知道如何解决的性能问题外,该模型目前在应用程序中做得很好。此应用程序中的功能之一是通过设置 Max Num 和 Rand 数来添加 Frame 元素 xml 节点。每个 Frame 元素将具有从 0 到 MaxNum - 1 和 0 到 MaxRand-1 的 Num 和 Rand 数。此外,我需要为 Rand=0 th 和 Rand=MaxRand-1 th 元素添加一个子 Parameter 元素。简略说明如下:
For Max Num=100, Max Rand=50
<Frame Num="0" Rand="0">
<Parameter Value="false"/>
</Frame>
<Frame Num="0" Rand="1"/>
<Frame Num="0" Rand="2"/>
...
<Frame Num="0" Rand="48"/>
<Frame Num="0" Rand="49">
<Parameter Value="true"/>
</Frame>
<Frame Num="1" Rand="0">
<Parameter Value="false"/>
</Frame>
<Frame Num="1" Rand="1"/>
<Frame Num="1" Rand="2"/>
...
<Frame Num="1" Rand="48"/>
<Frame Num="1" Rand="49">
<Parameter Value="true"/>
</Frame>
...
<Frame Num="99" Rand="0">
<Parameter Value="false"/>
</Frame>
<Frame Num="99" Rand="1"/>
<Frame Num="99" Rand="2"/>
...
<Frame Num="99" Rand="48"/>
<Frame Num="99" Rand="49">
<Parameter Value="true"/>
</Frame>
当 MaxNum 和 MaxRand 都很小时,即 Frame 元素的总数约为 50 时,应用程序运行良好。但是,当元素数超过 500 左右时,通过 QAbstractItemModel 函数添加 Frame 元素变得痛苦且呈指数级缓慢。GUI 冻结了很长一段时间,以至于我大部分时间都放弃了等待。
主要更新:
我发现在我的模型中插入大量(比如 1000 个项目)时导致速度变慢的原因。每个插入的项目我都调用了 insertRow(row, parent) 和 setData() 一次,由于这些函数内部发出的信号,这变得非常昂贵。
我已将代码修改为 insertRows(row, 1000, parent),并定义了一个不发出 dataChanged(currIndex, currIndex) 的新silentSetData()。我还包含了一个名为 notifyDataChanges(startRow, endRow, parentIndex) 的新公共函数,它依次为给定的数据范围发出一次 dataChanged 信号。一切都很好,但现在调用者类需要在插入整个数据集后显式调用 notifyDataChanges。
现在我想知道为什么发出 dataChanged 信号如此昂贵?一次在模型中插入/更改大量项目时,有没有人尝试过其他方法来克服这个问题?