目錄
一.凡心所向,素履所往
二.樹控制元件(QTreeWidget)基本用法
三.為樹節點添加回應時間
四.增加,修改和洗掉樹控制元件的節點
五.QTreeView控制元件與系統定制模式
一.凡心所向,素履所往
二.樹控制元件(QTreeWidget)基本用法
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class BasicTreeWidget(QMainWindow):
def __init__(self,parent=None):
super(BasicTreeWidget, self).__init__(parent)
self.setWindowTitle('樹控制元件(QTreeWidget)的基本用法')
self.resize(500,300)
#樹
self.tree=QTreeWidget()
#為樹控制元件指定列數
self.tree.setColumnCount(2)
#指定列標簽
self.tree.setHeaderLabels(['Key','Value'])
#根節點
root=QTreeWidgetItem(self.tree)
root.setText(0,'根節點') # 0代表第一列,即Key列
root.setIcon(0,QIcon('../picture/bag/bag1.jpg')) #為節點設定圖示
self.tree.setColumnWidth(0,200)#第一列列寬設為200
#添加子節點1
child1=QTreeWidgetItem(root)
child1.setText(0,'子節點1')#第一列Key為 子節點1
child1.setText(1,'子節點1的資料')#第二列Value為 子節點1的資料
child1.setIcon(0,QIcon('../picture/bag/bag2.jpg'))
#設定子節點1開啟復選框狀態
child1.setCheckState(0,Qt.Checked)
# 添加子節點2
child2=QTreeWidgetItem(root)
child2.setText(0,'子節點2')
child2.setIcon(0,QIcon('../picture/bag/bag3.jpg'))
#為child2添加一個子節點
child3=QTreeWidgetItem(child2)
child3.setText(0,'子節點2-1')
child3.setText(1,'新的值')
child3.setIcon(0,QIcon('../picture/bag/bag4.jpg'))
#默認所有節點都處于展開狀態
self.tree.expandAll()
#將樹控制元件設為中心控制元件,即樹控制元件會自動鋪滿整個螢屏
self.setCentralWidget(self.tree)
if __name__=='__main__':
app=QApplication(sys.argv)
main=BasicTreeWidget()
main.show()
sys.exit(app.exec_())
運行結果:

三.為樹節點添加回應時間
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class TreeEvent(QMainWindow):
def __init__(self,parent=None):
super(TreeEvent, self).__init__(parent)
self.setWindowTitle('為樹添加回應事件')
self.resize(400,300)
#樹
self.tree=QTreeWidget()
#為樹控制元件指定列數
self.tree.setColumnCount(2)
#指定列標簽
self.tree.setHeaderLabels(['Key','Value'])
#根節點
root=QTreeWidgetItem(self.tree)
root.setText(0,'root') # 0代表第一列,即Key列,值為root
root.setText(1,'0')
#添加子節點child1
child1=QTreeWidgetItem(root)
child1.setText(0,'child1')
child1.setText(1,'1')
# 添加子節點child2
child2=QTreeWidgetItem(root)
child2.setText(0,'child2')
child2.setText(1,'2')
#為child2添加一個子節點child3
child3=QTreeWidgetItem(child2)
child3.setText(0,'child3')
child3.setText(1,'3')
#信號和槽
self.tree.clicked.connect(self.onTreeClicked)
#將樹控制元件設為中心控制元件,即樹控制元件會自動鋪滿整個螢屏
self.setCentralWidget(self.tree)
def onTreeClicked(self,index): #index是被點擊節點的索引
item=self.tree.currentItem()#獲得當前單擊項
print('當前處于第%d行'%index.row())#輸出當前行(自己父節點的第幾個值)
print('key=%s,value=%s'%(item.text(0),item.text(1)))
print()
if __name__=='__main__':
app=QApplication(sys.argv)
main=TreeEvent()
main.show()
sys.exit(app.exec_())
運行結果:
eg:child1是root的第一個節點,故行數是0;child2是root的第二個節點,故行數是1;child3是child2的第一個節點,故行數是0
四.增加,修改和洗掉樹控制元件的節點
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ModifyTree(QWidget):
def __init__(self,parent=None):
super(ModifyTree, self).__init__(parent)
self.setWindowTitle('增加修改和洗掉樹控制元件中的節點')
self.resize(400,300)
operatorLayout=QHBoxLayout()#水平布局
addBtn=QPushButton('添加節點')
updateBtn=QPushButton('修改節點')
deleteBtn=QPushButton('洗掉節點')
operatorLayout.addWidget(addBtn)
operatorLayout.addWidget(updateBtn)
operatorLayout.addWidget(deleteBtn)
addBtn.clicked.connect(self.addNode)
updateBtn.clicked.connect(self.updateNode)
deleteBtn.clicked.connect(self.deleteNode)
# 樹
self.tree = QTreeWidget()
# 為樹控制元件指定列數
self.tree.setColumnCount(2)
# 指定列標簽
self.tree.setHeaderLabels(['Key', 'Value'])
# 根節點
root = QTreeWidgetItem(self.tree)
root.setText(0, 'root') # 0代表第一列,即Key列,值為root
root.setText(1, '0')
# 添加子節點child1
child1 = QTreeWidgetItem(root)
child1.setText(0, 'child1')
child1.setText(1, '1')
# 添加子節點child2
child2 = QTreeWidgetItem(root)
child2.setText(0, 'child2')
child2.setText(1, '2')
# 為child2添加一個子節點child3
child3 = QTreeWidgetItem(child2)
child3.setText(0, 'child3')
child3.setText(1, '3')
# 信號和槽
self.tree.clicked.connect(self.onTreeClicked)
mainLayout=QVBoxLayout(self)
mainLayout.addLayout(operatorLayout)
mainLayout.addWidget(self.tree)
self.setLayout(mainLayout)
def onTreeClicked(self, index): # index是被點擊節點的索引
item = self.tree.currentItem() # 獲得當前單擊項
print('當前處于第%d行' % index.row()) # 輸出當前行(自己父節點的第幾個值)
print('key=%s,value=%s' % (item.text(0), item.text(1)))
print()
def addNode(self):
print('添加節點')
item=self.tree.currentItem()# 獲得當前結點
print('當前節點是:',item)
node=QTreeWidgetItem(item)
node.setText(0,'新節點')
node.setText(1,'新值')
def updateNode(self):
print('修改節點')
item=self.tree.currentItem()
item.setText(0,'修改節點')
item.setText(1,'值已經被修改')
def deleteNode(self):
print('洗掉節點')
#防止item是root時,root無父結點報錯,要使用下面的寫法
rootFather=self.tree.invisibleRootItem()#獲得根節點root的不可見的父節點
for item in self.tree.selectedItems():
#父節點不為空
(item.parent() or rootFather).removeChild(item)
if __name__=='__main__':
app=QApplication(sys.argv)
main=ModifyTree()
main.show()
sys.exit(app.exec_())
運行結果:

五.QTreeView控制元件與系統定制模式
一般復雜的樹控制元件用QTreeView來寫
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
if __name__=='__main__':
app=QApplication(sys.argv)
#顯示目錄結構的模型
model=QDirModel()
tree=QTreeView()
tree.setModel(model)
tree.setWindowTitle('QTreeView')
tree.resize(600,400)
tree.show()
sys.exit(app.exec_())
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256791.html
標籤:其他
