在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總是返回樹型部件的頂部首項。