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 :

QTableView et les délégués


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Par défaut QTableView et les délégués
    En lisant la doc de la tableview, j'ai cru comprendre qu'on pouvait remplacer le champ d'édition d'une cellule par n'importe quel widget.
    Dans mon cas, j'aimerais que la première colonne soit de type QcheckBox, et la 3e de type QComboBox.

    Est-ce que quelqu'un pourrait m'aiguiller sur les méthodes à suivre, parce que pour le moment, je n'arrive à rien ...

    Merci beaucoup

    Julien

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    un code de ce style:
    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
    class MonDelegate(QItemDelegate):
        def __init__(self,parent=None):
            super(MonDelegate,self).__init__(parent)
     
        def createEditor(self,parent,option,index):
            if index.column()==0:
               ma_check=QCheckBox(parent)
               return  ma_check
     
            if index.column()==2:
               ma_combo=QComboBox(parent)
               ma_combo.addItems(['','item1','item2?....'])
                return ma_combo
           else :
              return QItemDelegate.createEditor(self,parent,option,index)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Par défaut
    Merci !
    Cela dit, est-il possible que les cellules conservent l'affichage des widgets quand elles ne sont pas selectionnées ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Par défaut
    Salut,

    Dans l'idée, xavier-pierre t'as proposé quelque chose qui peut te mettre sur la voie. Mais d'après ce que tu as l'air de vouloir, il va te falloir un peu plus de boulot pour arriver au resultat.

    Il faut par exemple re-implémenter paint() si tu veux avoir le visuel d'une CheckBox en dehors de l'édition. Sinon ton model ne montrera que la data en tant que string.

    Il faut aussi lier ta ComboBox à ton QAbstractModel pour que l'édition aille bien sauvegarder les donner la ou tu veux.

    Je suis tombé il y a quelques temps sur un blog assez bien foutu sur le même sujet que toi. Le voici: http://da-crystal.net/GCMS/blog/checkboxlist-in-qt C'est du C++, mais ca se converti très bien en python.


    Voici l'exemple que j'utilise et qui manipule dans un TableView, en colonne 0 une CheckBox, et en colonne 2 une ProgressBar.
    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
     
    class RepositoryTableDelegate(QtGui.QItemDelegate):
        '''
        Class that defines and implement the visual customization of the table
            view to show check boxes and progress bars.
        
        @ingroup DM
        '''
        def __init__(self, owner):
            '''
            Class constructor
            
            @param[in] owner The owner of this widget.
            '''
            QtGui.QItemDelegate.__init__(self, owner)
     
        def paint(self, painter, option, index):
            '''
            Method to draw the model.
            
            @param[in] painter The painter to use to draw.
            @param[in] option The QStyleOptionViewItem defining the needed object option.
            @param[in] index The
            '''
            column = index.column()
            if column == 0:
                # Get item data
                value = index.data(QtCore.Qt.DisplayRole).toBool()
     
                # fill style options with item data
                style = QtGui.QApplication.style()
                opt = QtGui.QStyleOptionButton()
                opt.state |= QtGui.QStyle.State_On if value else QtGui.QStyle.State_Off
                opt.state |= QtGui.QStyle.State_Enabled
                opt.text = ""
                opt.rect = option.rect
     
                # draw item data as CheckBox
                style.drawControl(QtGui.QStyle.CE_CheckBox, opt, painter)
                return
     
            elif column == 2:
                # Get the % number of loaded revisions.
                value = index.data(QtCore.Qt.DisplayRole)
                value,_ = value.toInt()
     
                # fill style options with item data
                style = QtGui.QApplication.style()
                opt = QtGui.QStyleOptionProgressBarV2()
                opt.maximum = 100
                opt.progress = value
                opt.rect = option.rect
                opt.textVisible = False
                opt.text = str(value)
     
                # draw item data as CheckBox
                style.drawControl(QtGui.QStyle.CE_ProgressBar, opt, painter)
                return
     
            QtGui.QItemDelegate.paint(self, painter, option, index)
     
        def createEditor(self, parent, option, index):
            column = index.column()
            if column == 0:
                # create check box as our editor.
                editor = QtGui.QCheckBox(parent)
                return editor
     
            elif column == 2:
                # create the ProgressBar as our editor.
                editor = QtGui.QProgressBar(parent)
                return editor
     
            return QtGui.QAbstractItemDelegate.createEditor(self, parent, option, index)
     
        def setEditorData(self, editor, index):
            column = index.column()
            if column == 0:
                # set editor data
                value = index.data(QtCore.Qt.DisplayRole).toBool()
                editor.setChecked(value)
                return
     
            elif column == 2:
                value,_ = index.data(QtCore.Qt.DisplayRole).toInt()
                editor.setValue(value)
                return
     
            QtGui.QAbstractItemDelegate.setEditorData(self, editor, index)
     
        def updateEditorGeometry(self, editor, option, index):
            editor.setGeometry(option.rect)
    Je suis désolé, je viens de me rendre compte que mon code n'est pas très bien commenté. Shame on me. Enfin te voici de quoi travailler.
    J'éditerai mon post avec les commentaire adéquates des que possible.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Par défaut
    Merci beaucoup ! C'est exactement ça, j'ai de quoi potasser ...

    Par contre, je viens d'implementer rapidement ton code sur une table view basique, et je ne peux pas cocher les Checkboxes, elles restent décochées tout le temps. Est-ce que tu as le même comportement ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Par défaut
    Il doit falloir que tu 'actives' l'éditeur. Pour cela il faut changer une option dans le QTableView que tu utilises.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # Set the event behavior.
    TableView.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
    TableView.viewport().installEventFilter(TableView)
    Avec cela ca devrait aller mieux. Mais la honnêtement on arrive a mes limites de compréhension de la mécanique de Qt, je n'ai pas eu le temps d'approfondir le pourquoi du comment de ces 2 lignes. Je me suis contenté de reprendre ce que j'avais vu sur le blog cité dans mon 1er post.

  7. #7
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Intéressant tout cela... bolbacool, serait-il possible de voir ton code au complet ?

    Je cherche de mon côté à mettre des lineedit muni d'une fonctionnalité de coloration syntaxique dans un TableView.

Discussions similaires

  1. Apostille au MVC : les délégués
    Par dourouc05 dans le forum Qt
    Réponses: 0
    Dernier message: 05/08/2011, 15h28
  2. Réponses: 0
    Dernier message: 29/12/2010, 00h06
  3. Comment enlever tous les délégués ?
    Par Papy214 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/10/2008, 12h21
  4. [C#] [WinForms] Les délégués dans la souffrance
    Par stailer dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/10/2004, 12h32

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