最近原來(lái)項(xiàng)目中使用了QTableWidget來(lái)加載20萬(wàn)條的數(shù)據(jù)量溃蔫。
它的實(shí)現(xiàn)方式是:首先查詢數(shù)據(jù)庫(kù)獲取所有數(shù)據(jù)的ID列表健提,垂直滾動(dòng)條長(zhǎng)度則表示實(shí)際的數(shù)據(jù)量,每次只加載顯示可見區(qū)域的數(shù)據(jù)伟叛,比如20條數(shù)據(jù), 當(dāng)滾動(dòng)條滾動(dòng)時(shí),則重新查詢數(shù)據(jù)加載新的20條數(shù)據(jù)暗膜,原來(lái)的20條數(shù)據(jù)則會(huì)被刪除,也就是當(dāng)前列表永遠(yuǎn)只展示20條數(shù)據(jù)瑞佩。
這樣實(shí)現(xiàn)的好處是,即使數(shù)據(jù)庫(kù)中有很多數(shù)據(jù),也不會(huì)有卡頓的現(xiàn)象酸纲。
但是它也有很多的弊端,它只能適用不復(fù)雜的場(chǎng)景外厂,比如單選模式,對(duì)于要支持ctrl掖棉、shift、鼠標(biāo)左鍵按下滑動(dòng)選擇的功能,由于當(dāng)前列表只加載20條數(shù)據(jù)香伴,Qt內(nèi)置的功能只能操作這20條數(shù)據(jù),所以需要自定義實(shí)現(xiàn),如果實(shí)現(xiàn)不好拔稳,必然會(huì)帶來(lái)很多的問(wèn)題。實(shí)際上項(xiàng)目也確實(shí)帶來(lái)了不少問(wèn)題,而且也不好維護(hù)。
為此奸远,考慮了幾套解決方案丸冕,它們都有各自的優(yōu)缺點(diǎn)。
方案一洪己、使用QSqlTableModel來(lái)顯示數(shù)據(jù)屑那,并且一次性加載所有的數(shù)據(jù),它的優(yōu)點(diǎn)是能夠使用Qt內(nèi)置所有功能,無(wú)需自定義實(shí)現(xiàn)姥份,它的缺點(diǎn)是加載超過(guò)20萬(wàn)數(shù)據(jù)的時(shí)候會(huì)有明顯卡頓現(xiàn)象埃难。
方案二、程序啟動(dòng)的時(shí)候,先預(yù)先加載一部分?jǐn)?shù)據(jù)座泳,比如1000條數(shù)據(jù),但是隨著滾動(dòng)條拖動(dòng)快到1000條數(shù)據(jù)的時(shí)候,則需要再加載1000條數(shù)據(jù)啦扬,并且前面已加載的數(shù)據(jù)不好銷毀瞄摊,這樣不斷的滾動(dòng)鹤啡,直到所有的數(shù)據(jù)都加載完成。它的優(yōu)點(diǎn)是同樣能夠使用Qt內(nèi)置所有功能疲眷,并且加載超過(guò)20萬(wàn)數(shù)據(jù)的時(shí)候也不會(huì)有卡頓現(xiàn)象,它的缺點(diǎn)是當(dāng)滾動(dòng)條拖動(dòng)到最后的時(shí)候蛋哭,會(huì)出現(xiàn)往上彈的現(xiàn)象。
方案三、列表分頁(yè)顯示,但是這個(gè)需要依據(jù)需求而定园欣。
綜上所述,使用QT進(jìn)行界面開發(fā)的時(shí)候备埃,盡量采用Qt支持的功能姓惑,因?yàn)樽远x實(shí)現(xiàn)并不能做到很完善,相反堪遂,它會(huì)帶來(lái)很多問(wèn)題以及加大后期維護(hù)的成本溶褪。
以上三個(gè)方案?jìng)€(gè)人認(rèn)為不少很好,希望有高手可以提供更好的解決方案筷频。