IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

PyQt Treeview + checkbox


Sujet :

PyQt Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut PyQt Treeview + checkbox
    Bonjour a tous,

    je fait un petit test avec une simple todolist pour découvrir l'utilisation d'un Qttreeview
    Conscient qu'il est important de dissocier le modèle de la vue dans mon application (modèle MVC), j'ai un soucis sur la mise à jour de mon modèle avec un Qttreeview.

    je ne sais pas ou je me prends les pieds dans la tapis....
    Par avance merci.

    Nota, pour l'instant mon modèle est codé en dur, mais je verrai pour le l’enregistrer en XML ou une petite base de données.


    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
    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
     
    # -*- coding: utf-8 -*
     
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    import sys
     
     
     
    class API():
        def __init__(self, model):
            self.model=model
            self.app = QApplication(sys.argv)
            self.tree = QTreeWidget()
            HEADERS = ("TITI", "TOTO", "column 3")
            self.tree.setColumnCount(len(HEADERS))
            self.tree.setHeaderLabels(HEADERS)
            headerItem = QTreeWidgetItem()
            item = QTreeWidgetItem()
     
            Qparent = QTreeWidgetItem(self.tree)
            Qparent.setText(0, "Root")
     
            self.parse(Qparent,self.model)
     
            self.tree.clicked.connect(self.onClick)
            self.tree.show()
            sys.exit(self.app.exec_())
     
        def parse(self,Qparent,branche):
            for elm in branche.child:
                Qchild = MyQTreeWidgetItem(parent=Qparent,model=branche)
                Qchild.setFlags(Qchild.flags() | Qt.ItemIsUserCheckable | Qt.ItemIsEditable)
                Qchild.setText(0, "{}".format(elm.txt).decode("utf-8"))
                Qchild.setText(1, "fifi {}".format(elm.responsable))
                if elm.statut == True:
                    Qchild.setCheckState(0, Qt.Checked)
                else:
                    Qchild.setCheckState(0, Qt.Unchecked)
     
                if elm.child != []:
                   # print elm.child
                    self.parse(Qchild,elm)
     
        def onClick(self, index):
            if self.app.mouseButtons() & Qt.RightButton :
                print self.tree.currentItem().model.txt
     
    class MyQTreeWidgetItem(QTreeWidgetItem):
        def __init__(self, parent,model):
            QTreeWidgetItem.__init__(self,parent)
            self.model = model
     
     
        def setData(self,*args,**kwds):
            role=args[2]
            index=args[0]
            data=args[1]
            super(MyQTreeWidgetItem,self).setData(*args,**kwds)
            print self.checkState(0)
            if self.checkState(0) == 0:
                self.setCheckState(0, Qt.Unchecked)
                print "coche", self.text(0)
            else:
                self.setCheckState(0, Qt.Checked)
                print "decoche", self.text(0)
     
     
        # def setData(self, index, data, role):
        #         print index, data,role
        #        # if not index.isValid():
        #        #     return False
        #
        #         if index.column() in self.booleanSet and role == Qt.CheckStateRole:
        #             value = QVariant(True) if data.toInt()[0] == Qt.Checked else QVariant(False)
        #             return QSortFilterProxyModel.setData(self, index, value, Qt.EditRole)
        #         else:
        #             return QSortFilterProxyModel.setData(self, index, data, role)
     
    class Todolist():
        idclass = 1
     
        def __init__(self,parent=None, txt="", statut=False, responsable=""):
            self.id = Todolist.idclass + 1
            Todolist.idclass = self.id
            self.statut = statut
            self.txt = txt
            self.responsable = responsable
            self.child=[]
            self.parent=parent
            if parent != None:
                parent.add_Action(self)
     
        # CRUD methode
        # todo....
     
        def get_Parent(self):
            return self.parent
     
        def add_Action(self,action):
            self.child.append(action)
     
        def __str__(self):
            print "{}\t{}\t{}".format(self.statut, self.txt, self.responsable)
            if self.child != []:
                for x in self.child:
                    print x
            return ""
     
    if __name__ == '__main__':
     
       myTdl=Todolist()
       Tdl_11=Todolist(myTdl,"Qualité", False, "moi")
       Tdl_12=Todolist(myTdl,"faire plein de chose 2", False, "1122")
       Tdl_13=Todolist(myTdl,"faire plein de chose 3", True, "1242")
       Tdl_31=Todolist(Tdl_11,"faire plein de chose 4", False, "1")
       Tdl_32 = Todolist(Tdl_11, "faire pl4", False, "i")
       Tdl_33 = Todolist(Tdl_11, "#######", False, "i")
       Tdl_15=Todolist(myTdl, "faire plein de chose 6", False, "58")
     
       API(myTdl)

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 794
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 794
    Billets dans le blog
    1
    Par défaut
    Bonjour

    J'ai récupéré et testé ton code qui (pour moi) fonctionne et donc je ne comprends pas trop ce que tu voudrais qu'il fasse. Bon c'est vrai que les print de la console sont affichés en repeat preuve qu'il y a des signaux qui passent en mode "boucle infinie" et ça c'est pas trop bien mais sans connaitre ton but je ne peux pas trop t'aider.

    Juste une remarque: en lignes 63 et 66 tu affiches "self.text(0)". Or ce texte est de l'utf8 vu que tu l'as demandé ainsi en ligne 34 (accessoirement, moi quand je veux stocker de l'UTF8 dans Qt, je passe par la méthode QString.fromUtf8("texte à stocker") qui est spécifique à Qt plutôt que la méthode "texte à stocker".decode("utf-8") qui est celle de Python).
    Et donc pour en revenir à ces lignes, tu ne peux pas afficher dans la console un QString qui contient des caractères accentués. Tant qu'il n'en contient pas ça va mais s'il en contient ça lève un UnicodeEncodeError.

    Pour afficher un QString, faut lui rajouter la méthode "toUtf8()" qui le transforme en QByteArray et y rajouter ensuite la méthode "data()" qui là le transforme en string Python => ex print self.text(0).toUtf8().data().
    Et tes indentations de ton main sont mauvaises (3 espaces au lieu de 4). C'est pour éviter ce souci que moi j'indente via les tabulations.

    De mon côté j'ai aussi une question à propos de ton "**kwds" car il me semblait que la convention était de nommer ce dictionnaire "**kwargs" ce qui signifie "keywords arguments" et donc je me demandais ce que signifiait le sigle "kwds".

    PS: je pense qu'un des motifs des signaux répétés est ton self.setCheckState(0, Qt.Unchecked) de la ligne 62. En effet, si tu associes ton QTreeWidget au signal "clicked" et que tu forces un checkState, Qt considère alors que le checkBox correspondant a été "cliqué" et appelle le slot correspondant.
    Quand tu veux modifier des widgets contenant une action associée à la modification, faut d'abord bloquer le lien signal/slot via la méthode blockSignals() à laquelle tu passes True (pour bloquer) et False (pour débloquer). Et la modification est vraiment à prendre au sens large (j'ai eu des soucis sur des QSpinBox pour lequel j'associais le signal "valueChanged" à une action et j'ai remarqué que ce signal était envoyé même quand on ne fait que donner les limites du QSpinBox via sa méthode setRange() alors que pour moi, dans ce cas là la valeur ne change pas).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Treeview, checkbox et radio button
    Par jacklafrip dans le forum C#
    Réponses: 2
    Dernier message: 13/08/2012, 14h33
  2. [Débutant] [C#] remplir treeview checkbox avec dataset
    Par waspy59 dans le forum Windows Presentation Foundation
    Réponses: 13
    Dernier message: 06/04/2012, 01h07
  3. Image de noeud de TreeView = checkbox + icône personnalisée
    Par Chavadam dans le forum Windows Forms
    Réponses: 0
    Dernier message: 13/08/2010, 11h32
  4. Réponses: 1
    Dernier message: 06/12/2008, 14h57
  5. treeView checkboxes sur certains noeuds
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 30/03/2007, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo