2012-01-05 91 views
0

我有建立这样
主窗口持有使用QAbstractListModel
而QListView当我启动应用程序,我使用线程工人
也就是说它的工作就是获取数据的记录启动单线程简单的应用程序从外部Web服务中,每个 迭代获得10-20条记录。
现在问题的一部分:
在从线工人开始
在大而循环,每个循环返回的记录
我发出信号,另一类称为ViewControler和其工作的HttpAggrigator类是填充到QListView模型
在这部分我的窗口只是冻结,直到所有的项目设置在列表视图。 我使用名为“Sleepy”的分析工具进行了检查,并在ViewControler方法中设置了项目 。
我的问题是我应该怎么做是正确的,这样项目将在轻量级的方式添加从聚集线程更新而QListView使GUI卡住

流程:您要添加项目到模型

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 

回答

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(); 
    } 
} 
+0

嗯,我尝试用: 无效的ListModel ::的addItem(MyItem * pMyItem){ (QModelIndex(),MyItemList.size(),MyItemList.size()); MyItemList << pMyItem; endInsertRows(); } 其中QList MyItemList; 但它dosnt帮助 – user63898 2012-01-05 16:06:19

+0

这仍然是一排。尝试更大的块。总共有多少行?检查模型的index()和data()是否快速。可能想尝试一个分析器(例如callgrind,如果在Unix上)来查看时间花在哪里。 – 2012-01-05 16:57:17

+1

检查我编辑的答案 – 2012-01-05 18:27:34