table des matières
1. Partout où votre cœur désire, où que vous alliez
2. Utilisation de base du widget arbre (QTreeWidget)
3. Ajouter un temps de réponse pour les nœuds d'arborescence
4. Ajouter, modifier et supprimer les nœuds de l'arborescence
5. Contrôle QTreeView et mode de personnalisation du système
1. Partout où votre cœur désire, où que vous alliez
Avant-hier soir, l'ami A s'est régalé, et je suis allée au rendez-vous avec joie, en compagnie d'un ami B de l'ami A, oui, à chaque fois que je vois un grand gars, je ne peux m'empêcher de soupirer, nous sommes trop petits .
A est un étudiant du même âge que moi, mais un niveau plus vieux que moi, mais il est maintenant étudiant en doctorat à l'Université nationale des sciences et de la technologie, et B est un étudiant diplômé du Beijing Post. Dans la salle à manger, je discutais de questions techniques, car ils étaient tous engagés dans l'informatique, bien que les directions soient différentes, ils étaient considérés comme des pairs.
En attendant, j'ai aussi parlé de la vie et des sentiments, mais quand je les ai entendus parler de projets, de stages, de concours, de revenus, etc., j'ai senti qu'ils n'étaient pas une personne du même niveau. Hé, l'autisme sur la route devenir plus fort est vraiment inévitable.
Après le dîner, il était neuf heures passées, alors je vivais juste dans la maison de A.
Même si je n'ai pas la capacité pour eux, ce n'est pas cool de mettre en œuvre mon intention initiale et de me battre pour les choses que j'aime pour ma vie.
Après une journée de jeu aujourd'hui, je suis rentré chez moi le soir, après le dîner, j'ai noté ce sentiment et tout le monde m'a encouragé.
2. Utilisation de base du widget arbre (QTreeWidget)
Code:
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_())
résultat de l'opération:
3. Ajouter un temps de réponse pour les nœuds d'arborescence
Code:
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_())
résultat de l'opération:
Par exemple: child1 est le premier nœud de root, donc le nombre de lignes est 0; child2 est le deuxième nœud de root, donc le nombre de lignes est 1; child3 est le premier nœud de child2, donc le nombre de lignes est 0
4. Ajouter, modifier et supprimer les nœuds de l'arborescence
Code:
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_())
résultat de l'opération:
5. Contrôle QTreeView et mode de personnalisation du système
Les contrôles d'arborescence généralement complexes sont écrits avec QTreeView
Code:
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_())
résultat de l'opération: