最近原來項目中使用了QTableWidget來加載20萬條的數據量。
它的實現方式是:首先查詢數據庫獲取所有數據的ID列表,垂直滾動條長度則表示實際的數據量,每次只加載顯示可見區域的數據,比如20條數據, 當滾動條滾動時,則重新查詢數據加載新的20條數據,原來的20條數據則會被刪除,也就是當前列表永遠只展示20條數據。
這樣實現的好處是,即使數據庫中有很多數據,也不會有卡頓的現象。
但是它也有很多的弊端,它只能適用不復雜的場景,比如單選模式,對于要支持ctrl、shift、鼠標左鍵按下滑動選擇的功能,由于當前列表只加載20條數據,Qt內置的功能只能操作這20條數據,所以需要自定義實現,如果實現不好,必然會帶來很多的問題。實際上項目也確實帶來了不少問題,而且也不好維護。
為此,考慮了幾套解決方案,它們都有各自的優缺點。
方案一、使用QSqlTableModel來顯示數據,并且一次性加載所有的數據,它的優點是能夠使用Qt內置所有功能,無需自定義實現,它的缺點是加載超過20萬數據的時候會有明顯卡頓現象。
方案二、程序啟動的時候,先預先加載一部分數據,比如1000條數據,但是隨著滾動條拖動快到1000條數據的時候,則需要再加載1000條數據,并且前面已加載的數據不好銷毀,這樣不斷的滾動,直到所有的數據都加載完成。它的優點是同樣能夠使用Qt內置所有功能,并且加載超過20萬數據的時候也不會有卡頓現象,它的缺點是當滾動條拖動到最后的時候,會出現往上彈的現象。
方案三、列表分頁顯示,但是這個需要依據需求而定。
綜上所述,使用QT進行界面開發的時候,盡量采用Qt支持的功能,因為自定義實現并不能做到很完善,相反,它會帶來很多問題以及加大后期維護的成本。
以上三個方案個人認為不少很好,希望有高手可以提供更好的解決方案。