繁体   English   中英

QAbstractItemModel:为什么在将这么多项目插入模型时这么慢会发出dataChanged并插入行信号?

[英]QAbstractItemModel: Why emitting dataChanged and insert rows signals when inserting numerous items into model so slow?

您可以在Stackoverflow的所有Qt模型/视图编程大师中找到您好。 我正在从事的项目要求我为XML数据定义QAbstractItemModel派生的模型。 我之前在此模型的实现过程中遇到问题时曾在这里问过一个问题: 通过源模型函数从源模型删除一行时,QSortFilterProxyModel崩溃

除了一些我不知道如何解决的性能问题外,该模型当前在应用程序中的工作非常出色。 此应用程序中的功能之一是通过设置Max Num和Rand编号来添加Frame元素xml节点。 每个Frame元素的Num和Rand编号分别从0到MaxNum-1和0到MaxRand-1。 此外,我将需要为每个Rand = 0和Rand = MaxRand-1元素添加一个子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信号如此昂贵? 一次在模型中插入/更改大量项目时,是否有人尝试过其他方法来克服此问题?

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

void MyModel:setNewData(const QStringList newList) {

  beginResetModel();

  m_dataList = newList;

  endResetModel();
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM