在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:\temp,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:\tools,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:\temp,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:\tools
item = d:\tools,aboveItem = d:\work ,belowItem = ue.exe
item = ue.exe,aboveItem = d:\tools ,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:\temp
item = c:\temp,aboveItem = c:\ ,belowItem = c:\Python
item = c:\Python,aboveItem = c:\temp ,belowItem = d:\
item = d:\,aboveItem = c:\Python ,belowItem = d:\work
item = d:\work,aboveItem = d:\ ,belowItem = d:\tools
item = d:\tools,aboveItem = d:\work ,belowItem = ue.exe
item = ue.exe,aboveItem = d:\tools ,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!

PyQt(Python+Qt)学习随笔:树型部件QTreeWidget的itemAbove、itemBelow方法作用探究的更多相关文章

  1. PyQt(Python+Qt)学习随笔:QWidget部件的palette属性以及ColorGroup、colorRole的用途和含义

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 1.palette属性 QWidget部件的palette属性用于控制 ...

  2. PyQt(Python+Qt)学习随笔:设定toolButton弹出菜单的方法

    在Qt Designer中toolButton可以通过popupMode设定菜单弹出的模式,但并不能在Qt Designer中指定toolButton的弹出菜单,toolButton只能通过代码来指定 ...

  3. PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性

    autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中部件的accessibleDescription和accessibleName辅助阅读属性

    accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性(关于国际化请参考<PyQt(Python+Qt)学习随笔:Qt D ...

  6. PyQt(Python+Qt)学习随笔:Qt Designer中部件的toolTip、toolTipDuration、statusTip、whatsThis属性

    toolTip属性 toolTip属性设置部件的toolTip提示信息,toolTip提示信息在鼠标放到控件上会浮动出一个小框显示提示信息.默认情况下,仅显示活动窗口子部件的toolTip,可以通过在 ...

  7. PyQt(Python+Qt)学习随笔:部件的大小策略sizePolicy的含义

    在Qt Designer中的每个部件,除了设置部件的位置(geometry)之外,还可以指定部件的大小策略sizePolicy.部件的sizePolicy用于说明部件在布局管理中的缩放方式,当部件没有 ...

  8. PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的shortcut 属性

    shortcut 属性保存与按钮关联的快捷键.可以使用shortcut()和setShortcut(QKeySequence)访问和设置该属性. 关于这个属性官网介绍的不多,经老猿实际验证,它与tex ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的icon属性和iconSize属性

    icon属性 icon属性保存按钮上展示的图标,图标的缺省大小由图形界面的样式决定,但可以通过 iconSize 属性进行调整. 图标的几种子属性状态的含义与QWidget的windowIcon属性相 ...

  10. PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的sizeHint属性

    在两种Spacer部件中都有sizeHint属性,在<PyQt(Python+Qt)学习随笔:Qt Designer中部件的三个属性sizeHint缺省尺寸.minimumSizeHint建议最 ...

随机推荐

  1. MVC中Cookie的用法(二)---CookieHelper

    public class CookieHelper { /// <summary> /// 1.1添加Cookie /// </summary> /// <param n ...

  2. JavaScript变量声明与变量声明提前

    JavaScript变量声明 JavaScript中存储数据的容器称为变量.用关键字和标识符创建新变量的语句,称为变量声明.可以通过关键字var进行变量声明,在ES6中增加了let.const关键字声 ...

  3. javascript中什么是函数

    函数的定义 在javascript中函数是一段可以被执行或调用任意次数的JavasScript代码,在数据类型中属于"function".函数也拥有属性和方法,因此函数也是对象. ...

  4. martini-能量最小化参数(mdp文件)

    1 ; 2 ; STANDARD MD INPUT OPTIONS FOR MARTINI 2.x 3 ; Updated 02 feb 2013 by DdJ 4 ; 5 ; for use wit ...

  5. 手把手教你使用Vuex(一)

    1.定义 vuex 是一个专门为vue.js应用程序开发的状态管理模式. 这个状态我们可以理解为在data中的属性,需要共享给其他组件使用的部分.也就是说,是我们需要共享的data,使用vuex进行统 ...

  6. http 响应 ngx_http_send_header ngx_http_output_filter

    在解析完  http 请求报文后, 需要发出响应报文, 那么ngx 框架 提供了那些通用接口呢?如果自己设计将所用的模块的响应接口合并起来 你会怎么设计呢?? 响应头过滤函数主要的用处就是处理HTTP ...

  7. GDT,LDT,GDTR,LDTR (转 侵删)

    一.引入 保护模式下的段寄存器 由 16位的选择器 与 64位的段描述符寄存器 构成 段描述符寄存器: 存储段描述符 选择器:存储段描述符的索引 段寄存器(16位选择子,64为隐藏信息) 原先实模式下 ...

  8. 精尽MyBatis源码分析 - MyBatis初始化(四)之 SQL 初始化(下)

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  9. Poem Codes - 攻防世界(Decrypt-the-Message)

    Poem Codes Poem Code 最显著的特点就是一首诗歌. 详情请戳这里 让我们一起来过滤一遍这个神奇的加密过程~ ① 给出一首诗歌 for my purpose holds to sail ...

  10. 重新认识Lombok

    Lombok插件 简介 那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后 ...