QListWidget高性能加載圖片數據


自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取:

https://www.cnblogs.com/bclshuai/p/11380657.html

QListWidget高性能加載圖片數據

 

目錄

1      應用場景

2      問題

3      解決思路

 

 

1       應用場景

在QListWidget中插入自定義的圖片,並且按照相似度進行自動排序。和QListWidget中插入QListWidgetItem,然后調用setItemWidget(QListWidgetItem *item, QWidget *widget);方法去設置自定義的widget對象。在QListWidgetItem中設置相似度。item->setText(QString::number(m_MapPathPicResult [m_strSelectPicPath][i].matchPercent, 'f', 4));去設置相似度,然后設置 QListWidget自動排序屬性,按照逆序進行排序。ui.listMatchWidget->setSortingEnabled(true);

ui.listMatchWidget->sortItems(Qt::DescendingOrder);

2       問題

當數據量比較大的時候,刷新界面胡非常的卡頓。而且切換不同的數據時,需要重新申請內存,加載圖片,1000張圖片的加載時間大概在10秒左右。

 

 

 

3       解決思路

方法1:懶加載的方式,將數據保存在Qlist中,每次只加載顯示界面內的20個數據,需要自定義ScrollBar,QList的大小對應ScrollBar的最大值,滑塊的位置動態變化,從QList中取出20個數據顯示,每次都要刷新界面,並且動態設置scroll的范圍。如果新插入數據需要先排序,然后在計算滑塊坐標位置。計算量比較大。如果要有一些選擇操作,每次刷新之前都要記住選中的圖片,並重置選中狀態,實現相對復雜。

方法2:復用內存,界面已經添加的QListWidgetItem對象可以循環復用。不去銷毀。先了解了幾個函數。

removeItemWidget(QListWidgetItem *aItem)

刪除和aItem綁定的widget,會清除掉widget的內存,但是aItem內存仍然存在不會刪除。aItem仍然在Qlistwidget中。

 QListWidgetItem *takeItem(int row);

從QListWidget中拿走第row行的item,並且會清除與item綁定的widget,刪除widget的內存,需要手動執行delete item來清除item的內存。

void clear();

clear函數會清空QListWidget中的所有的QListWidgetItem和綁定的的widget,清除內存。

所以只能復用Item,不能復用widget,需要重新申請widget的內存。

 

方法3:直接復用界面上已經插入的item和widget,將數據設置進去,如果第二次比第一數據多,那么多出來的就要重新申請內存。如果第二次比第一次少,那么就需要將界面上的多余的item,調用takeItem函數從QListWidget取出,放入內存池保存起來,因為takeItem自動銷毀綁定的widget,目前還沒有找到方法不去銷毀widget,復用widget。所以下次獲取widget時,需要重新new widget綁定到item上。在兩次數量差距比較大時,還是會很卡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM