1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| #!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from node import cNode
# L'application Qt
class QtAppli(QApplication):
"Fenêtre de l'application"
# Constructeur fenêtre
def __init__(
self,
argv,
noeud):
# Message de contrôle
print "QtAppli (qt v%s, pyqt_v%s)" % (QT_VERSION_STR, PYQT_VERSION_STR)
# Appel constructeur de l'objet hértié
QApplication.__init__(self, argv)
# Attributs de l'application (c'est juste par habitude)
self.argv=argv
# Widget principale
self.wid=QMainWindow()
self.wid.setCentralWidget(QWidget(self.wid))
self.wid.statusBar()
# Titre
self.wid.setWindowTitle("Amusements avec Qt (v%s)" % QT_VERSION_STR)
# Un espace de rangement
layoutG=QVBoxLayout(self.wid.centralWidget())
layoutG.setMargin(5)
layoutG.setSpacing(5)
# L'arbre Qt créé à partir du noeud demandé
arbreQt=QtArbreProjet(noeud)
# Pour quitter
quit=QPushButton()
quit.setText("Quitter")
self.connect(quit, SIGNAL("clicked()"), self.wid, SLOT("close()"))
# Rangement des éléments dans le layout
layoutG.addWidget(arbreQt)
layoutG.addWidget(quit)
# __init__()
# Affichage et lancement application
def run(self):
self.wid.show()
self.exec_()
# run()
# class QtAppli
# Mon arbre perso
class QtArbreProjet(QFrame):
# Constructeur arbre
def __init__(self, noeud):
# Appel constructeur de l'objet hértié
QFrame.__init__(self)
# Le schéma permettant de gérer les branches
self.__schema={}
# Un espace de rangement
layoutG=QVBoxLayout(self)
layoutG.setMargin(0)
layoutG.setSpacing(0)
# L'arbre proprement dit
self.__arbre=QTreeWidget()
# Une case à cocher
self.__deployCheck=QCheckBox(QString.fromUtf8("Déploiement"))
self.connect(
self.__deployCheck,
SIGNAL("stateChanged(int)"),
self.__slotDeploy,
)
# Rangement des éléments dans le layout
layoutG.addWidget(self.__arbre)
layoutG.addWidget(self.__deployCheck)
# Construction de l'arbre proprement dit
self.__construct(noeud)
# __init__()
# Nettoyage (si besoin)
def clear(self):
# Nettoyage de l'arbre et de son schema
self.__arbre.clear()
self.__schema={}
# clear()
# Construction de l'arbre à partir du noeud
def __construct(self, noeud):
# Nettoyage initial
self.clear()
# Le titre de l'arbre
self.__arbre.setHeaderLabel(QString.fromUtf8("%s (nb=%d)" % (noeud.libelle, noeud.count(True))))
# Traitement du noeur de base
for (node, prof) in noeud.get_node():
# Création de la branche
# Celle-ci est rattachée à la branche contenant le noeud parent (si existe) sinon à la racine de l'arbre
count=node.count() - 1
item=QTreeWidgetItem(
self.__schema[node.parent] if node.parent != None else self.__arbre,
QStringList(
QString.fromUtf8("%s%s" % (node.libelle, " (%d)" % count if count != 0 else ""))
),
)
# La branche créée est mémorisée dans le schéma (elle pourra ainsi servir de parente à une autre)
self.__schema[node]=item
# for
# Déploiement par défaut (éventuellement)
#self.__deployCheck.setChecked(Qt.Unchecked)
# __construct()
# Le slot qui gère le déploiement en fonction de la case cochée
def __slotDeploy(self, check):
# Etats possibles
state={
Qt.Checked : True,
Qt.Unchecked : False,
}
# Déploiement des branches en fonction de l'état de la case
[x.setExpanded(state[check]) for x in self.__schema.values()]
# __slotDeploy()
# class QtArbreProjet
# Pour tester la classe
if __name__ == "__main__":
# Création de l'arbre
arbre=cNode("projet")
# Ajout d'une branche
arbre["projet"]=cNode("main.c")
arbre["main.c"]=cNode("stdio.h")
arbre["projet"]=cNode("module.c")
arbre["module.c"]=cNode("sys/types.h")
arbre["module.c"]=cNode("sys/socket.h")
arbre["stdio.h"]=cNode("sys/types.h")
# Application Qt qui va afficher mon arbre
Appli=QtAppli(sys.argv, arbre["projet"])
Appli.run() |
Partager