簡體   English   中英

QListWidget具有許多自定義項的性能

[英]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

至於在添加大量項目時隱藏窗口小部件,這將有助於減輕無關的更新調用。 上面的第二個建議應該減輕這一點。

我認為這是完全預期的行為,如ListsTrees類的控件,不基於任何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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM