• PyQt(Python+Qt)学习随笔:树型部件QTreeWidget的itemAbove、itemBelow方法作用探究


    在QTreeWidget的方法中,对于itemBelow、itemAbove方法,官网文档介绍非常简单。

    一、itemAbove、itemBelow官网说明介绍及困惑

    • itemAbove方法
      调用方法:QTreeWidgetItem itemAbove(QTreeWidgetItem item)
      返回参数item项之上的项。
    • itemBelow方法
      调用方法:QTreeWidgetItem itemBelow(const QTreeWidgetItem item)
      返回参数item项之下的项。

    什么是之上、什么是之下呢?没有详细说明,在网上也没有找到相关资料,老猿猜测是同一层级的前或后。为此老猿进行了验证。

    二、验证方法

    构建一个包含多层的树型目录,然后逐层输出每个项自身以及该项的itemAbove、itemBelow对应项的信息。对应应用界面截图如下:
    在这里插入图片描述

    三、验证过程

    3.1、通过Designer设计界面

    界面只有一个名为treeWidget的对象,有3列:
    在这里插入图片描述
    并将QTreeWidget部件的鼠标双击信号与界面窗口的doubleClick()槽方法建立连接,如图:
    在这里插入图片描述

    3.2、调用PyUIC将界面生成一个Python模块文件

    生成的模块文件中对应界面类为Ui_mainWin,模块文件名为ui_treeWidget.py。

    3.3、在界面派生类中实现方法initTreeItems来构造界面展示的树型目录

     def initTreeItems(self):
    		#构造C盘及目录、文件项
            cdriver = QtWidgets.QTreeWidgetItem(["c:\", "NTFS", "50G"])
            cdir1 = QtWidgets.QTreeWidgetItem(["c:\temp", "directory", "500M"])
            cdir2 = QtWidgets.QTreeWidgetItem(["c:\Python", "directory", "1G"])
            cfile11 = QtWidgets.QTreeWidgetItem(["tempfile1.txt", "file", "128K"])
            cfile12 = QtWidgets.QTreeWidgetItem(["tempfile2.txt", "file", "1M"])
            cdir1.insertChildren(1, [cfile11, cfile12])
            self.treeWidget.addTopLevelItem(cdriver)
            cdriver.addChildren([cdir1, cdir2])
            
    	    #构造d盘及目录、文件项
            ddriver = QtWidgets.QTreeWidgetItem(["d:\","NTFS","100G"])
            workdir = QtWidgets.QTreeWidgetItem(["d:\work", "directory", "1G"])
            tooldir = QtWidgets.QTreeWidgetItem(["d:\tools","directory","15G"])
            studydir = QtWidgets.QTreeWidgetItem(["d:\study", "directory", "10G"])
            ue = QtWidgets.QTreeWidgetItem(["ue.exe","执行文件","256K"])
            pycharm = QtWidgets.QTreeWidgetItem(["pycharm.exe", "执行文件", "128M"])
            designer = QtWidgets.QTreeWidgetItem(["designer.exe", "执行文件", "256M"])
            self.treeWidget.addTopLevelItem(ddriver)
            #self.treeWidget.insertTopLevelItem(0,cdriver)
            tooldir.addChildren([ue,pycharm,designer])
            ddriver.addChildren([workdir, tooldir, studydir])
            #ddriver.addChild(workdir)
            #ddriver.addChild(tooldir)
            #ddriver.addChild(studydir)
    	    
    	    #构造e盘
            edriver = QtWidgets.QTreeWidgetItem(["e:\", "NTFS", "100G"])
            self.treeWidget.addTopLevelItem(edriver)
            #ddriver.setExpanded(True)
    

    上述代码中除了部分真正的注释外,其他注释的代码是为了做各种测试使用,无需关注。

    3.4、实现输出树型目录中项信息的方法showTreeItemInfo

    	#针对树型部件中每个顶层项输出项及其上和其下项信息,并对其子项也同样处理
        def showTreeItemInfo(self):
            count = self.treeWidget.topLevelItemCount()  
            for i in range(count):
                item = self.treeWidget.topLevelItem(i)
                self.showItemAboveAndBelowInfo(item,0)
    
        #针对指定项输出项及其上和其下项信息,并对其子项也同样处理 
        def showItemAboveAndBelowInfo(self,item,spaceCnt):
            aboveItem = self.treeWidget.itemAbove(item)
            belowItem = self.treeWidget.itemBelow(item)
            if aboveItem:
                print(f'{"    "*spaceCnt}item = {item.text(0)},aboveItem = {aboveItem.text(0)} ',end=' ')
            else:
                print(f'{"    "*spaceCnt}item = {item.text(0)},No aboveItem',end=' ')
            if belowItem:
                print(f',belowItem = ', belowItem.text(0))
            else:
                print(",No belowItem")
    
            childCount = item.childCount()
            if childCount:
                for i in range(childCount):self.showItemAboveAndBelowInfo(item.child(i),spaceCnt+1)
    

    3.5、在界面派生类构造方法中调用initTreeItems构造界面展示的树型目录后调用方法showTreeItemInfo输出每个项的信息

    class mainWin(ui_treeWidget.Ui_mainWin,QtWidgets.QWidget):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.treeWidget.headerItem().setText(0, "文件或目录名")
            self.treeWidget.headerItem().setText(1, "类型")
            self.treeWidget.headerItem().setText(2, "大小")
            self.treeWidget.headerItem().setSizeHint(0,QtCore.QSize(self.treeWidget.width()/2,10))
            self.initTreeItems() #构造显示的树型目录
            self.showTreeItemInfo() #输出树型部件中项的信息
    

    3.6 实现槽方法doubleClick

    在doubleClick中调用showTreeItemInfo输出每个项的信息。

    3.7、运行界面,查看输出信息

    应用运行后,界面信息如下:
    在这里插入图片描述
    构造方法中输出的项信息如下:

    item = c:,No aboveItem ,belowItem =  d:
        item = c:	emp,No aboveItem ,belowItem =  c:
        item = c:Python,No aboveItem ,belowItem =  c:
    item = d:,aboveItem = c:  ,belowItem =  e:
        item = d:work,No aboveItem ,belowItem =  c:
        item = d:	ools,No aboveItem ,belowItem =  c:
            item = ue.exe,No aboveItem ,belowItem =  c:
            item = pycharm.exe,No aboveItem ,belowItem =  c:
            item = designer.exe,No aboveItem ,belowItem =  c:
        item = d:study,No aboveItem ,belowItem =  c:
    item = e:,aboveItem = d:  ,No belowItem
    
    

    可以看到顶层项的aboveItem指向顶层上一节点项,如果没有则是None,belowItem指向顶层下一节点项,如果没有则是None。但子项全部没有aboveItem ,belowItem 全部指向顶层第一个节点。老猿为此做了很多测试,包括调整项的构建顺序、插入顺序、一次插入多个子项或逐个插入等,结论都是一样。

    3.8、将树型节点中包含子项的节点部分或全部展开,双击鼠标输出项信息

    3.8.1、部分子项展开

    在这里插入图片描述
    输出信息:

    item = c:,No aboveItem ,belowItem =  d:
        item = c:	emp,No aboveItem ,belowItem =  c:
        item = c:Python,No aboveItem ,belowItem =  c:
    item = d:,aboveItem = c:  ,belowItem =  d:work
        item = d:work,aboveItem = d:  ,belowItem =  d:	ools
        item = d:	ools,aboveItem = d:work  ,belowItem =  ue.exe
            item = ue.exe,aboveItem = d:	ools  ,belowItem =  pycharm.exe
            item = pycharm.exe,aboveItem = ue.exe  ,belowItem =  designer.exe
            item = designer.exe,aboveItem = pycharm.exe  ,belowItem =  d:study
        item = d:study,aboveItem = designer.exe  ,belowItem =  e:
    item = e:,aboveItem = d:study  ,No belowItem
    

    可以看到在界面上可见的项的aboveItem 指向界面上在它之上的第一个项,belowItem 指向界面下面在其下可见的第一个项,未显示的项全部没有aboveItem ,belowItem 全部指向顶层第一个节点。

    3.8.2、所有子项展开

    以上结论老猿经过多次验证最终得出。我们再看一个所有子项完全展开的例子。
    界面:

    在这里插入图片描述
    输出信息:

    item = c:,No aboveItem ,belowItem =  c:	emp
        item = c:	emp,aboveItem = c:  ,belowItem =  c:Python
        item = c:Python,aboveItem = c:	emp  ,belowItem =  d:
    item = d:,aboveItem = c:Python  ,belowItem =  d:work
        item = d:work,aboveItem = d:  ,belowItem =  d:	ools
        item = d:	ools,aboveItem = d:work  ,belowItem =  ue.exe
            item = ue.exe,aboveItem = d:	ools  ,belowItem =  pycharm.exe
            item = pycharm.exe,aboveItem = ue.exe  ,belowItem =  designer.exe
            item = designer.exe,aboveItem = pycharm.exe  ,belowItem =  d:study
        item = d:study,aboveItem = designer.exe  ,belowItem =  e:
    item = e:,aboveItem = d:study  ,No belowItem
    

    可以看到与上述结论相同。

    四、结论

    • QTreeWidget的itemAbove(QTreeWidgetItem item)方法在参数item对应项在界面上显示时,返回在界面上该项上面第一个项对应的项,如果上面没有项则返回None,如果参数item对应项在界面上未显示、则itemAbove为None。
    • QTreeWidget的itemBelow(QTreeWidgetItem item)方法在参数item对应项在界面上显示时,返回在界面上该项下面第一个项对应的项,如果下面没有项则返回None,如果参数item对应项在界面上未显示、则itemAbove总是返回树型部件的顶部首项。

    老猿Python,跟老猿学Python!

  • 相关阅读:
    Flume-概述-安装
    Hive-函数
    Hive_查询
    Hive-DML数据操作
    JDBC-文档
    Hive-DDL数据定义
    Hive-数据类型
    理解RESTful架构
    REST介绍
    [转]详述DHCP服务器的三种IP分配方式
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/12570508.html
Copyright © 2020-2023  润新知