2016-01-27 109 views
2

可以理解的是,下面的代碼顯示QList.addItems調用需要0.393秒。我在一個更大的程序中使用類似的代碼 - 這個想法是給用戶提供一個(非常)大量的獨特零件號碼。他們開始在一個單獨的QEntry小部件中輸入一個正則表達式,這個小部件實時更新QList,並隨着時間的推移縮短列表的長度。如何更改我的QListWidget實現以提高性能?

我的問題是,在如此大的列表,它需要的時間作爲用戶輸入他們的正則表達式更新的QList視圖明顯的量。我不認爲這是一個獨特的問題 - 這個問題的常見解決方案是什麼?如何以合理的方式截斷我的列表,使用戶體驗不會受到明顯的負面影響? QListView是一個更好的替代方案嗎?當用戶滾動時,將這個列表縮短到100個左右,並且實時加載更多的項目是否有意義?或者這種方法有缺陷嗎?

import time 
from itertools import cycle 
from PyQt4 import QtCore, QtGui 

pns = cycle(['ABCD', 'EFGH', 'IJKL', 'MNOP']) 

pn_col = [] 
for i in range(505000): 
    pn_col.append("{}_{}".format(next(pns), i)) 

app = QtGui.QApplication([]) 
myList = QtGui.QListWidget() 
start = time.clock() 
myList.addItems(pn_col) 
print("Time = {}".format(time.clock() - start)) 

更新:原來我的名單實際上是約4000重複了總計500K的獨特價值。衛生署!刪除重複項目修復了我的性能問題。儘管如此,我仍然對知道科學和材料感興趣,因爲它們更有效地列出這些數據。這是一個真正的平面清單,我不能輕易對它們進行分組或分層。

+0

將所有**展示在平面列表中的目的是什麼?這似乎是一個非常可怕的界面(想象你的文件管理器以這種方式工作)。事實上,你可以使用模式逐步減少列表的大小,這意味着數據可以被構造爲一棵樹。如果是這樣,樹的每個分支可以根據需要填充,而不是一次加載所有內容。 – ekhumoro

回答

2

一個QListWidget是小型列出了便利部件。要獲得真實的列表,您應該有一個QListView與您要實現的QAbstractListModel關聯。

在您的例子,該列表是500K項目長!如何使用真正的數據庫來處理?使用Qt,您可以將QSqlTableModel關聯到SQLite,請參閱doc here。排序和搜索將在SQL中完成,並將結果傳播到模型中。

注:如果您使用Python 2.7,更換range()通過xrange(),它一次,而不是構建在內存500K元素的整個列表返回一個值。