我有像这样构建的简单应用程序
Mainwindow使用QAbstractListModel持有QListView
当我启动应用程序时,我使用线程工作者启动单线程
它的工作是从外部Web服务获取数据记录,每个记录获得10-20条记录
迭代。
现在问题部分:
在从线程工作者开始的HttpAggrigator类中
在每个返回记录上迭代的big while循环中
我向另一个调用ViewControler的类发出信号,并将其作业填充到QListView模型中
在这部分中,我的窗口只是冻结,直到列表视图中设置了所有项目。
我检查了名为“Sleepy”的分析工具,并在设置项目的ViewControler方法中进行了检查
缓慢下降
我的问题是我该怎么做才能以轻量方式添加项目
流程:
MainWindow -> start HttpAggrigator (in different thread )
HttpAggrigator -> get records -> start iterate them ( to fill data objects )
HttpAggrigator -> emit signal to ViewControler on each records iteration to build item into MainWindow QListView
答案 0 :(得分:1)
每次将项目添加到模型时,都会导致视图重绘自身。您应该将项目聚合到一个列表中,并立即将其插入到模型中。您将有1次重绘而不是n次重绘
一次使用多个项目的方法
void LostModel::addItems(QList<MyItem *> items)
{
if(items.size())
{
int begin = MyItemList.size();
beginInsertRows(QModelIndex(), begin, begin + items.size() - 1);
MyItemList.append(items);
endInsertRows();
}
}