gpt4 book ai didi

c++ - QAbstractItemModel:为什么在向模型中插入大量项目时发出 dataChanged 和插入行信号如此缓慢?

转载 作者:行者123 更新时间:2023-11-30 02:06:00 30 4
gpt4 key购买 nike

大家好,这里是 Stackoverflow 中的所有 Qt 模型/ View 编程专家。我正在从事的项目要求我为 XML 数据定义一个 QAbstractItemModel 派生模型。之前在实现这个模型的过程中遇到问题的时候在这里问过一个问题: QSortFilterProxyModel crashes when deleting a row from the source model via the source model function

除了一些我不知道如何解决的性能问题外,该模型目前在应用程序中运行良好。这个里面的功能之一应用是通过设置Max Num和Rand数来添加Frame元素xml节点。每个 Frame 元素的 Num 和 Rand 数字分别从 0 到 MaxNum - 1 和 0 到 MaxRand-1。此外,我需要为 Rand=0 th 和 Rand=MaxRand-1 th 元素分别添加一个子参数元素。简图如下:

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),并定义了一个新的 silentSetData(),它不会发出 dataChanged(currIndex, currIndex)。我还包含了一个名为 notifyDataChanges(startRow, endRow, parentIndex) 的新公共(public)函数,它依次为给定的数据范围发出一次 dataChanged 信号。一切正常,但现在调用者类需要在插入整组数据后显式调用 notifyDataChanges。

现在我想知道为什么发射 dataChanged 信号如此昂贵?在一次插入/更改模型中的大量项目时,是否有人尝试过其他方法来克服这个问题?

最佳答案

另一种方法是显式重置模型数据结构。例如,在我的一个模型中,数据用 QStringList 表示。我已经实现了一个重置​​模型中数据的函数。例如:

void MyModel:setNewData(const QStringList newList) {

beginResetModel();

m_dataList = newList;

endResetModel();
}

我想这种方法也适用于您的情况。

关于c++ - QAbstractItemModel:为什么在向模型中插入大量项目时发出 dataChanged 和插入行信号如此缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9174494/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com