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 avec comboBox [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut QTableView avec comboBox
    Bonjour,

    Je veux afficher une QTableView dont une des colonnes serait des listes déroulantes. Grâce à ce vieux post : http://www.developpez.net/forums/d76...iew-delegates/

    J'ai plus ou moins repris son code et du coup j'ai le même problème, c'est-à-dire que les comboBox s'affichent mais elles ne gardent pas les valeurs que l'utilisateur sélectionne.

    Une idée pour me débloquer serait vraiment bienvenue !

    Ci-dessous les parties utiles du 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
    class ComboBoxDelegate(QtGui.QItemDelegate):
     
    	def __init__(self, owner, itemslist):
    		QtGui.QItemDelegate.__init__(self, owner)
    		self.itemslist = itemslist
     
    	def paint(self, painter, option, index):		
    		# Get Item Data
    		value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
    		# fill style options with item data
    		style = QtGui.QApplication.style()
    		opt = QtGui.QStyleOptionComboBox()
    		opt.currentText = str(self.itemslist[value])
    		opt.rect = option.rect
     
    		# draw item data as ComboBox
    		style.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt, painter)
     
    	def createEditor(self, parent, option, index):
    		# create the ProgressBar as our editor.
    		editor = QtGui.QComboBox(parent)
    		editor.addItems(self.itemslist)
    		editor.setCurrentIndex(0)
    		editor.installEventFilter(self)			
    		return editor
     
    	def setEditorData(self, editor, index):
    		value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
    		editor.setCurrentIndex(value)
     
    	def setModelData(self,editor,model,index):
    		value = editor.currentIndex()
    		model.setData(index, QtCore.QVariant(value))
     
    	def updateEditorGeometry(self, editor, option, index):
    		editor.setGeometry(option.rect)
     
     
     
        class SequenceGridModel(QtCore.QAbstractTableModel):
        def __init__(self, datain, headerdata, parent=None, *args):
            QtCore.QAbstractTableModel.__init__(self, parent, *args)
            self.parent = parent
            self.arraydata = datain
            self.headerdata = headerdata
     
        def flags(self, index):
            if index.column() == 13:
                return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
            return QtCore.QAbstractTableModel.flags(self, index)
     
     
        def data(self, index, role = QtCore.Qt.DisplayRole):
          if not index.isValid():
             if role == QtCore.Qt.UserRole:
                return None
             else:
                return QtCore.QVariant()
     
          value = QtCore.QVariant(self.arraydata[index.row()][index.column()])
     
          if QtCore.Qt.UserRole == role:
             return value
          elif role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
             return QtCore.QVariant(value)
          return QtCore.QVariant()
     
     
     
        class SequenceGrid(QtGui.QTableView):
        def __init__(self, parent=None):
            QtGui.QTableView.__init__(self, parent) 
     
            self.selectedIndexes = []
            self.parent = parent
     
            self.checkValues = ['TODO', 'WAITING', 'RETAKE', 'OK']
     
            self.model = SequenceGridModel(self.data, header, self)
            self.setModel(self.model)
            self.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
            self.viewport().installEventFilter(self)
            self.setItemDelegateForColumn(13,ComboBoxDelegate(self, self.checkValues))
     
            self.setColumnWidth(13, 64)
    Merci d'avance pour votre aide!

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je pense que la fonction setEditorData a une lacune, l'index que tu donne est en fait la valeur

    Avec ceci ça fonctionne correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        def setEditorData(self, editor, index):
            text = self.table.licences[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
            pos = editor.findText(text)
            if pos == -1:  
                pos = 0
            editor.setCurrentIndex(pos)
    (self.table.licences est la liste des items de la combo)

    Par comparaison, ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	def setEditorData(self, editor, index):
    		value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
    		editor.setCurrentIndex(value)
    où value n'est pas l'index mais la donnée

    Je n'ai pas tout regardé, mais ça m'a sauté aux yeux.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut
    Merci pour ta réponse,
    j'ai corrigé ça dans setEditorData, mais ça ne m'affiche toujours pas l'item séléctionné dans la liste.
    D'ailleurs il n'affiche pas non plus celui par défaut, donc c'est peut-être dans la fonction paint() qu'il y a un problème ?
    J'ai essayé de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
    Comme dans setEditorData(), mais ça change juste le type d'affichage lorsque la case n'est pas séléctionnée (la cellule apparait comme une cellul simple jusqu'à ce que l'on click dessus, alors qu'avant une liste déroulante apparaissait avec l'item par défaut à vide)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Par défaut
    C'est bon j'ai trouvé la réponse.
    Il suffit d'appeler la fonction openPersistentEditor(index) de QAbstractItemView dans la fonction paint du Delegate.

    J'espère que ça pourra aider quelqu'un.
    Merci en tout cas!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec combobox et Etats
    Par el_quincho dans le forum IHM
    Réponses: 1
    Dernier message: 13/03/2006, 12h05
  2. état avec combobox.
    Par JauB dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 28/02/2006, 13h56
  3. [vb.net]Boite de dialogue avec combobox
    Par le Daoud dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/12/2005, 12h53
  4. [VB.NET] Probleme avec ComboBox
    Par Aspic dans le forum VB.NET
    Réponses: 5
    Dernier message: 20/11/2005, 12h37
  5. [VB6] [Interface] Grille avec combobox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/01/2003, 09h55

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