近期用pyqt、pymupdf做一pdf查看器。获取到的目录结构是一个python 列表。将其解析并加入到QTreeWidget中费了一番周折,特此记录。
获取到的内容类似这种:self.tocs = [[1, 'test', 1], [2, 'test', 2], [2, 'test', 4], [3, 'test', 5], [3, 'test', 8], [4, 'test', 9],[2, 'test', 10], [3, 'test', 12], [1, 'test', 15]]。
画个图比较形象:
lvl | title | page |
---|---|---|
1 | test | 1 |
2 | test | 2 |
2 | test | 4 |
3 | test | 5 |
3 | test | 8 |
4 | test | 9 |
2 | test | 10 |
3 | test | 12 |
1 | test | 15 |
其中,lvl:目录层级;title:目录内容;page:目录对应文档页码。
视觉上层级分明,但将数据添加到QTreeWidget中做到层级分明却又没这么简单。
挤破脑袋想到了下面方法。
首先对每一条进行编号,然后记录每一条的父级编号(一级目录父级记为 -1)。
lvl | title | page | num | parent |
---|---|---|---|---|
1 | test | 1 | 1 | -1 |
2 | test | 2 | 2 | 1 |
2 | test | 4 | 3 | 1 |
3 | test | 5 | 4 | 3 |
3 | test | 8 | 5 | 3 |
4 | test | 9 | 6 | 5 |
2 | test | 10 | 7 | 1 |
3 | test | 12 | 8 | 7 |
1 | test | 15 | 9 | -1 |
代码如下:
def tocAddNumParent(self):
toc_list = self.tocs[0]
top_lev = toc_list[0]
print "top_lev:", top_lev
for i in range(len(self.tocs)):
parent = -1
toc = self.tocs[i]
# 添加编号
self.tocs[i].append(i)
# 顶层
if toc[0] == top_lev:
self.tocs[i].append(parent)
# 非顶层与上一条同级,则parent相同
elif self.tocs[i][0] == self.tocs[i-1][0]:
parent = self.tocs[i-1][4]
self.tocs[i].append(parent)
# 非顶层在上一条下级,则parent为上一层
elif self.tocs[i][0] > self.tocs[i-1][0]:
parent = self.tocs[i-1][3]
self.tocs[i].append(parent)
# 非顶层比上一条层级高,如果不为顶层则顺序向上找,找到同级的
elif self.tocs[i][0] < self.tocs[i-1][0]:
if self.tocs[i][0] != top_lev:
# 一直向上找
for j in range(i-2, 0, -1):
if self.tocs[j][0] == self.tocs[i][0]:
parent = self.tocs[j][4]
break
self.tocs[i].append(parent)
接下来就可以将数据插入到QTreeWidget中了。遍历数据,从第一条开始插入,插入一条后,遍历数据找到所有以该条为父目录的所有目录,然后将这些目录作为子条目插入,重复上述过程。
def departTree(self, parentNum, item):
curLists = self.findItem(parentNum)
if len(curLists) != 0:
for i in range(len(curLists)):
toc = curLists[i]
text = toc[1]
page = toc[2]
num = toc[3]
childItem = QTreeWidgetItem()
childItem.setData(0, QtCore.Qt.UserRole, page)
childItem.setText(0, text.decode('utf-8'))
childItem.setToolTip(0, text.decode('utf-8'))
childItem.setText(1, str(page))
item.addChild(childItem)
# 递归插入子item
self.departTree(num, childItem)
def findItem(self, parent):
curLevList = []
for i in range(len(self.tocs)):
if self.tocs[i][4] == parent:
curLevList.append(self.tocs[i])
return curLevList