Bonjour à tous,
J'ai deux QCombobox et un dictionnaire de dictionnaires pour mimer une arborescence.
La première combobox,combo1, contient "des enfants" et je voudrais que la deuxième combobox, combo2, contienne "les petits enfants".
Pour initialiser, ça va. Mais je n'arrive pas à rafraichir le contenu de combo2 quand celui de combo1 change.
Voici le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
"""
ZetCode PyQt4 tutorial 
 
This example shows
how to use QtGui.QComboBox widget.
 
author: Jan Bodnar
website: zetcode.com 
last edited: September 2011
 
Modif
author: Jean-Patrick Pommier
website: dip4fish.blogspot.com 
last edited: March 2012
 
Given a tree like structure : dic={"p1":{"s1":5,"s2":7},"p2":{"s3":1,"s4":2}}
if p1 is selected in combo1 then combo2 should be filled with: s1, s2
   p2 -------------------------------------------------------: s3, s4
 
"""
 
import sys
from PyQt4 import QtGui, QtCore
 
class CascadeMenu(QtGui.QWidget):
 
    def __init__(self,dico):
        super(CascadeMenu, self).__init__()
        #print dico.keys()
        self.initUI(dico)
 
    def initUI(self,dico):      
        print dico.keys()
        self.lbl = QtGui.QLabel("CytoM", self)
        #self.fullpath should be first element of menu1 / first elem of menu2
        self.fullpath=QtGui.QLabel("path", self)
 
        combo1 = QtGui.QComboBox(self)
        for entry in dico.keys():
            print entry
            combo1.addItem(entry)
        #Find visible entry (first element) in combo1
#        print "first combo1 item",combo1.itemText(0)
#        print "type",type(combo1.itemText(0))
#        print str(combo1.itemText(0))
#        print "set 1st item in second menu",dico.get(str(combo1.itemText(0)))
        combo2=QtGui.QComboBox(self)
        for entry in dico.get(str(combo1.itemText(0))):
            print entry
            combo2.addItem(entry)
 
        combo1.move(50, 50)
        combo2.move(100, 50)
        #combo1.
        self.lbl.move(50, 150)
 
        #Signal -> Slot 
        combo1.activated[str].connect(self.onActivated)
 
        # let's try that
        combo2.activated[str].connect(self.onActivated)
 
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Cascade Menus')
        self.show()
 
    def fillNextCombo(self,previouscombo):
        pass
 
    def onActivated(self, text):
        print text#how 'text' is build?
        self.fullpath.setText("should be menu1/menu2") 
        self.fullpath.adjustSize()  
        self.lbl.setText(text)
        self.lbl.adjustSize()  
 
def main():
    print 
    app = QtGui.QApplication(sys.argv)
    dic={"p1":{"s1":5,"s2":7},"p2":{"s3":1,"s4":2}}
    ex = CascadeMenu(dic)
    sys.exit(app.exec_())
 
if __name__ == '__main__':
    main()
J'ai déjà vu une question à ce sujet. Je vois bien qu'il y a un problème signal/slot, mais débutant avec pyQt4 je ne comprend pas la réponse.
Comment corriger le code pour que cela fonctionne?
Merci d'avance.
Jean-Patrick Pommier