自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取:
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上。在兩次數量差距比較大時,還是會很卡。