2014-08-29 73 views
2

我有一個約2500個自定義項目的列表。我將它們設置爲:QListWidget性能很多自定義項目

const std::vector<const Items::AbstractItem *> results = _engine.request(text); 
    if (!results.empty()) 
    { 
     for (auto i : results){ 
      QListWidgetItem *lwi = new QListWidgetItem; 
      _results->addItem(lwi); 
      ListItemWidget *w = new ListItemWidget; 
      w->setName(i->name()); 
      w->setTooltip(i->path()); 
      _results->setItemWidget(lwi, w); 
     } 
     _results->setFixedHeight(std::min(5,_results->count()) * 48); // TODO 
     _results->show(); 
    } 

這在i5-4590上需要大約5秒。隱藏小部件速度快兩倍。這是正常的還是我有找錯誤?

+1

與往常一樣,處理性能時運行一個分析器是你應該開始的,因爲它比猜測和試驗要好。我現在得到的關於你的問題的唯一想法是你可以預先分配項目,但我並不認爲內存分配可能是這裏的問題。也許繪畫? – user2672165 2014-08-29 16:11:43

回答

1

我認爲這是完全預期的控制行爲,如ListsTrees不基於任何data model。我相信data model的發明主要是爲了解決這個問題。

在你的情況你有一個ListWidget控制,它自己存儲它的數據。您需要在應用程序可以繼續之前通過所有2500個項目,並且即使您的列表一次只顯示10個項目,也需要執行此操作。即使您只是運行並關閉應用程序,用戶也不會看到所有項目,但仍需將它們傳遞給您的ListWidget。一些GUI框架使用內部分配的項目,在這種情況下,他們可以優化一些東西,如果您將塊分配給Items,但它仍然不是一個好的解決方案。

現在讓我們假設你介紹一些對象,可能是關於項目屬性。 Control詢問某些項目和您的對象將回應的內容。你的物品甚至不需要知道你的所有物品,它只會在需要的時候學習。 您Control可以詢問很少的第一件物品,並在意識到它可以填滿其整個高度時停下來。這樣可以避免現在不需要的工作。 Control也可以詢問物品數量,因此它可以設置其垂直滑塊。

需要說的是,model不會自動解決你的問題,它只是一個編程範例,可以讓你做得更好。

因此,您的解決方案將是用QListView替換您的QListWidget,並實現您自己的繼承QAbstractListModel的數據模型。您可以將results傳遞給模型,並在需要時傳遞項目數據。

+0

默認情況下是否實現了懶人?還是必須強制/啓用它? – ManuelSchneid3r 2014-09-01 22:15:52

+0

在'QListView'中,您不啓用/禁用它,它只是數據模型方法的結果,但您需要正確實現您的模型,因此它只在需要時加載數據。 – kolenda 2014-09-02 08:37:44

3

幾個想法:

  • 請儘量把QWidgets分配適當的家長,這就是方式佈局沒有爲你做這個 映射。這應該有助於表現。

  • 呼叫setUpdatesEnable(假)開始插入之前,和真正的,它的完成

後作爲隱藏窗口小部件,而加入大量的項目,這將有助於緩解外來更新調用。上面的第二個建議應該可以緩解這個問題。

+0

setUpdatesEnable(false)不起作用。至少在5.3。第一個沒有任何明顯的區別。 – ManuelSchneid3r 2014-09-01 22:13:46

1

如果您的QListWidgetItem的尺寸始終保持不變,請致電QListWidget上的setUniformItemSizes,傳遞true。

+0

謝謝。好的提示。 – ManuelSchneid3r 2014-09-01 22:15:21