[英]QListWidget performance with many custom items
我有一個包含大約2500個自定義項目的列表。 我用它們設置:
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秒鍾。 隱藏窗口小部件的速度是原來的兩倍。 這是正常的還是我找錯了?
一些想法:
嘗試為QWidgets分配適當的父項,這樣布局就不必為您進行此映射。 這應該有助於提高績效
在開始插入之前調用setUpdatesEnable(false),在完成插入之后調用true
至於在添加大量項目時隱藏窗口小部件,這將有助於減輕無關的更新調用。 上面的第二個建議應該減輕這一點。
我認為這是完全預期的行為,如Lists
或Trees
類的控件,不基於任何data model
。 我相信data model
發明主要是為了解決這個問題。
在您的情況下,您有一個ListWidget
控件,可以自己存儲其數據。 您需要在應用程序啟動之前傳遞所有2500個項目,即使您的列表一次只顯示10個項目,也需要執行此操作。 即使您只是運行並關閉應用程序,用戶也不會看到所有項目,但您仍需要將它們傳遞給ListWidget
。 一些GUI框架使用項目的內部分配,在這種情況下,他們可以稍微優化一下,如果你以塊的形式分配你的Items
,你可以做同樣的事情,但它仍然不是一個好的解決方案。
現在讓我們假設您介紹一些可以詢問項目屬性的對象。 Control
將詢問某個項目,您的對象將響應內容。 您的對象甚至不需要了解您的所有物品,只需在需要時學習。 您Control
可以問幾個第一項,當它意識到它可以填補其整個高度停止。 這樣您就可以避免現在不需要的工作。 Control
還可以詢問項目計數,因此可以設置其垂直滑塊。
需要說的是,該model
不會自動解決您的問題,它只是一種編程范例,可以讓您做得更好。
所以你的解決方案是用QListView替換你的QListWidget,並實現你自己繼承QAbstractListModel
的數據模型。 您可以將results
傳遞給模型,並在需要時傳遞項目數據。
如果你的QListWidgetItem
總是有固定的大小,在你的QListWidget
上調用setUniformItemSizes
,傳遞true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.