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:\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!

發佈了636 篇原創文章 · 獲贊 3422 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章