pyqt 获取pdf目录添加到QTreeWidget

       近期用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

titlepage
1test1
2test2
2test4
3test5
3test8
4test9
2test10
3test12
1test15

        其中,lvl:目录层级;title:目录内容;page:目录对应文档页码。

        视觉上层级分明,但将数据添加到QTreeWidget中做到层级分明却又没这么简单。

        挤破脑袋想到了下面方法。

        首先对每一条进行编号,然后记录每一条的父级编号(一级目录父级记为 -1)。

lvltitlepagenumparent
1test11-1
2test221
2test431
3test543
3test853
4test965
2test1071
3test1287
1test159-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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值