Question

J'utilise un délégué personnalisé pour afficher une colonne de ComboBoxes dans mon QTableView.

En plus du problème de sélection par défaut (Entrez la description du lien ici) J'ai un problème lorsque je réorganisais les données de mon QTableView (par colonne, ou en appliquant des filtres). Les chenbox restent où ils étaient lorsque la grille n'était pas affichée.

Existe-t-il un moyen de forcer une repeinte du délégué? Je copier le code de la méthode de peinture (sans l'index), mais cela n'a fait que chasser mon programme.

Faites-moi savoir si je ne suis pas assez clair.

Voici le code de mon délégué personnalisé:

 class ComboBoxDelegate(QtGui.QItemDelegate):

    def __init__(self, parent, itemslist):
        QtGui.QItemDelegate.__init__(self, parent)
        self.itemslist = itemslist
        self.parent = parent

    def paint(self, painter, option, index):        
        # Get Item Data
        value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
        # value = self.itemslist[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)
        self.parent.openPersistentEditor(index)

    def createEditor(self, parent, option, index):

        ##get the "check" value of the row
        # for row in range(self.parent.model.rowCount(self.parent)):
            # print row

        self.editor = QtGui.QComboBox(parent)
        self.editor.addItems(self.itemslist)
        self.editor.setCurrentIndex(0)
        self.editor.installEventFilter(self)    
        self.connect(self.editor, QtCore.SIGNAL("currentIndexChanged(int)"), self.editorChanged)

        return self.editor

    # def setEditorData(self, editor, index):
        # value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
        # editor.setCurrentIndex(value)

    def setEditorData(self, editor, index):
        text = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
        pos = self.editor.findText(text)
        if pos == -1:  
            pos = 0
        self.editor.setCurrentIndex(pos)


    def setModelData(self,editor,model,index):
        value = self.editor.currentIndex()
        model.setData(index, QtCore.QVariant(value))


    def updateEditorGeometry(self, editor, option, index):
        self.editor.setGeometry(option.rect)

    def editorChanged(self, index):
        check = self.editor.itemText(index)
        id_seq = self.parent.selectedIndexes[0][0]
        update.updateCheckSeq(self.parent.db, id_seq, check)


    def updateDelegate(self, indexRow, indewCol):
        # index = self.parent.model.createIndex(indexRow, indewCol)

        seq_id = self.parent.model.arraydata[indexRow][0]
        print seq_id
        check = select.getCheck(self.parent.db, seq_id)
        check = check[0][0]
        print check
        if check != '':
            pos = self.checkDict[check]
        else:
            pos = 0
        self.editor.setCurrentIndex(pos)

Et je l'appelle à partir de ma classe QTableView:

 self.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
    self.viewport().installEventFilter(self)
    self.delegate = ComboBoxDelegate(self, self.checkValues)
    self.setItemDelegateForColumn(13,self.delegate)

J'appelle la fonction UpdatedElegate lorsque je trierai la colonne (à partir de la classe de modèle):

  def sort(self, Ncol, order):
        self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()"))
        self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol))
        i = 0
        for row in self.arraydata:
            self.parent.delegate.updateDelegate(i, 13)
            i += 1
        if order == QtCore.Qt.DescendingOrder:
            self.arraydata.reverse()
        self.emit(QtCore.SIGNAL("layoutChanged()"))

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top