2012-01-05 64 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