我发现递归m在制作巨大目录结构的树结构时,它的速度非常慢。下面的方法可能会有帮助。
def update_right_dock(self, file_list):
obj_list = []
maps = []
level = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] #Stores Maximum and Current Levels For The TreeWidget
level_name = ["", "", "", "", "", "", "", "", "", "", "", "", "", ""] #Stores Previous File Path To Compare before adding file or folder to tree
tree.clear()
prev = ""
tot_len = 2
p = 0
for file in file_list:
if(os.path.isdir(file)):
is_file = 0
else:
is_file = 1
tmp_map = []
file = file[1:]
abs_path = file.split('/')
abs_path_len = len(abs_path)
filename = abs_path[-1]
if(prev == file[:tot_len - 1]):
#print("LOOOOOOOOOOOOP ------ 1")
while (i < abs_path_len - 1):
level[level_counter + 1] = QTreeWidgetItem(level[level_counter], [abs_path[i]])
tmp_map.append(level[level_counter + 1])
tmp_map.append(level_counter + 1)
tmp_map.append(1)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter + 1].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter + 1])
level_counter = level_counter + 1
level_name[i] = abs_path[i]
i = i + 1
level[level_counter + 1] = QTreeWidgetItem(level[level_counter], [abs_path[i]])
tmp_map.append(level[level_counter + 1])
tmp_map.append(level_counter + 1)
tmp_map.append(0)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter + 1].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter + 1])
file_len = len(filename)
tot_len = len(file) - file_len
prev = file[:tot_len - 1]
continue
len2 = len(level_name)
k = 0
while k < abs_path_len and k < len2:
if (level_name[k] == abs_path[k]):
k = k + 1
continue
break
level_counter = k + 1
i = level_counter - 1
while k < abs_path_len:
level_name[k] = abs_path[k]
k = k + 1
if level_counter > 1:
#print("LOOOOOOOOOOOOP ------ 2")
if(i == abs_path_len - 1):
level_counter = level_counter - 1
while i < abs_path_len - 1:
level[level_counter] = QTreeWidgetItem(level[level_counter - 1], [abs_path[i]])
tmp_map.append(level[level_counter])
tmp_map.append(level_counter)
tmp_map.append(1)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter])
level_counter = level_counter + 1
level_name[i] = abs_path[i]
i = i + 1
if i == abs_path_len - 1:
level_counter = level_counter - 1
level[level_counter + 1] = QTreeWidgetItem(level[level_counter], [abs_path[i]])
tmp_map.append(level[level_counter + 1])
tmp_map.append(level_counter + 1)
tmp_map.append(0)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter + 1].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter + 1])
file_len = len(filename)
tot_len = len(file) - file_len
prev = file[:tot_len - 1]
continue
if(abs_path_len == 1):
level[level_counter + 1] = QTreeWidgetItem(tree, [abs_path[i]])
tmp_map.append(level[level_counter + 1])
tmp_map.append(level_counter + 1)
tmp_map.append(0)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter + 1].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter + 1])
continue
i = 1
#print("LOOOOOOOOOOOOP ------ 3")
level[level_counter] = QTreeWidgetItem(tree, [abs_path[0]])
tmp_map.append(level[level_counter])
tmp_map.append(level_counter)
tmp_map.append(1)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter])
level_name[level_counter - 1] = abs_path[0]
while i < abs_path_len - 1:
level[level_counter + 1] = QTreeWidgetItem(level[level_counter], [abs_path[i]])
tmp_map.append(level[level_counter + 1])
tmp_map.append(level_counter + 1)
tmp_map.append(1)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter + 1].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter + 1])
level_counter = level_counter + 1
level_name[i] = abs_path[i]
if i == abs_path_len - 1:
level_counter = level_counter - 1
i = i + 1
level[level_counter + 1] = QTreeWidgetItem(level[level_counter], [abs_path[i]])
tmp_map.append(level[level_counter + 1])
tmp_map.append(level_counter + 1)
tmp_map.append(0)
obj_list.append(tmp_map)
tmp_map = []
level[level_counter + 1].setCheckState(0, Qt.Checked)
tree.expandItem(level[level_counter + 1])
level_name[i] = abs_path[i]
file_len = len(filename)
tot_len = len(file) - file_len
prev = file[:tot_len - 1]
p = p + 1
[这](http://stackoverflow.com/questions/15178807/python-pyside-using-a-custom-widget-in-a-qtreewidget)问题看起来相似,但仅提供了一种通用方法,没有可悲的代码。但它可能会帮助你 – M4rtini
虽然你可以用'QTreeWidget'来做到这一点,你真的应该使用由模型支持的'QTreeView'。否则,您将不断需要重新填充整个树来反映更改。 –