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

Nissa ·
更新时间:2024-11-01
· 644 次阅读

老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址

在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! 老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址
作者:LaoYuanPython



qtreewidget 学习 pyqt Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号