在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. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  2. Statistical physics approaches to the complex Earth system(相关系统建模理念方法的摘要)

    本文翻译自"Statistical physics approaches to the complex Earth system",其虽然是针对复杂地球系统的统计物理方法的综述,但 ...

  3. Spider--实战--selenium_12306

    # login12306_02 # 图像识别涉及到深度学习,这里直接将验证码识别任务发送到大佬的验证码解析地址,不过现在已经失效了,程序跑到这会报错. # 用户名和密码存储在本地工作目录中的 user ...

  4. scjp卡壳题

    1. void looper() { int x = 0; one: while (x < 10) { two: System.out.println(++x); if (x > 3) { ...

  5. 数据采集与融合第四次作业:多线程以及scrapy框架的使用

    数据采集第四次作业:多线程以及scrapy框架的使用 任务一:单多线程的使用 单线程代码: from bs4 import BeautifulSoup from bs4 import UnicodeD ...

  6. 牛客网-声网2020校招-通用C++笔试题-2020.9.3

    1. 操作系统中两个进程争夺同一个资源会发生什么情况? 答:不一定死锁 解析:产生死锁的四个必要条件为 (1)互斥条件:一个资源每次只能被一个进程使用. (2)不可剥夺条件:进程已获得的资源,在未使用 ...

  7. awk1

    awk [选项参数] 'script' var=value file(s)或aawk [选项参数] -f scriptfile var=value file(s)项参数说明:-F fs or --fi ...

  8. tcpack--3快速确认模式- ack状态发送&清除

    ACK发送状态的转换图 ACK的发送状态清除 当成功发送ACK时,会删除延迟确认定时器,同时清零ACK的发送状态标志icsk->icsk_ack.pending ACK发送事件主要做了:更新快速 ...

  9. CTF练习(1)这是一张单纯的图片?

    1.练习平台http://123.206.31.85/challenges 2.图片下载后放进WInhex 最后安利一个  CTF资源库|CTF工具包|CTF工具集合 网站,里面工具很全,很方便   ...

  10. [原题复现][极客大挑战 2019]BuyFlag

    简介  原题复现:[极客大挑战 2019]BuyFlag  考察知识点:php函数特性(is_numeric().strcmp函数())  线上平台:https://buuoj.cn(北京联合大学公开 ...