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

Python Discussion :

Erreur : Segmentation fault: 11 a cause d'un delegate


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 38
    Points : 16
    Points
    16
    Par défaut Erreur : Segmentation fault: 11 a cause d'un delegate
    Bonjour,

    j'ai un delegate qui me permet d'afficher une liste déroulante dans un tableau :

    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
    class AssignmentDelegate(QtGui.QItemDelegate):
     
        def __init__(self, owner):
            QtGui.QItemDelegate.__init__(self, owner)
     
            #On charge TOUTES la table "Categories" dans le model
            self.modelAssignment = QSqlTableModel(self)
            self.modelAssignment.setTable("Assignments")
            self.modelAssignment.select()
     
     
        def createEditor(self, parent, option, index):
            text = index.data(QtCore.Qt.DisplayRole).toString()
            editor = QtGui.QComboBox(parent)
            editor.setModel(self.modelAssignment);
            editor.setModelColumn(self.modelAssignment.fieldIndex("name"))
            indexCat = editor.findText(unicode(text))
            editor.setCurrentIndex(indexCat)
            editor.installEventFilter(self)         
            return editor
     
        def setEditorData(self, editor, index):
            value = index.data(QtCore.Qt.DisplayRole).toString()
            indexAss = editor.findText(unicode(value))
            editor.setCurrentIndex(indexAss)
     
        def setModelData(self,editor,model,index):
            value = editor.currentIndex()
            myIndex = self.modelAssignment.index(value, 0)
            assignmentId = self.modelAssignment.data(myIndex, 0).toInt()[0]
            #Enregistrement
            model.setData(index, QtCore.QVariant(assignmentId))
     
            #En cas de virement, on doit mettre à jour les deux enregistrements.
            row = index.row()
            if model.index(row, 14).data().toInt()[1] == True:
                idVirement = model.index(row, 14).data().toInt()[0]
                query = QSqlQuery()
                query.exec_('UPDATE Operations\
                             SET assignment_id = \"'+str(assignmentId)+'\"\
                             WHERE (virement_id = '+str(idVirement)+')')
                #print query.lastError().text()
            ####################################################################
    Et j'ai une méthode pour supprimer (dans un autre widget) des item de la liste déroulante.

    Une fois supprimé, je recharge le delegate du tableau pour qu'il actualise les liste et que l'item supprimé n'apparaisse plus.
    Le truc c'est que si j'actualise le delegate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.parent.tableView.setItemDelegateForColumn(6,PlacementDelegate(self))
    apres j'ai une erreur Segmentation fault: 11 des que j'affiche le fameux tableau.

    Quelqu'un peut-il m'expliquer comment faire différemment? je ne comprend pas bien l'erreur… Ou bien comment éviter cette erreur?

    Merci d'avance

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Tu ne peux pas directement faire le changement dans le delegate ?

    Je pose la question, parce que je le fais dans un cas similaire, une combo dans un tableau.

    Dans ton code, ça donnerait quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        def createEditor(self, parent, option, index):
            ...
            # Garder une référence
            self.editor = editor         
            return editor
     
        def remove_item(self, idx):
            self.blockSignals(True)
            self.editor.removeItem(idx)
            self.blockSignals(False)
    J'ignore si le blocage de signaux est nécessaire pour toi, mais il se fait que je vois, dans mon code, un commentaire où j'indique que sans bloquer les signaux j'obtenais une ... erreur de segmentation.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    En fait t'as réponse m'a fait penser à autre chose.
    En fait, j'ai sorti le model qui me sert à charger la QComboBox du delegate.
    Du coup je n'ai plus qu'a mettre à jour ce model là pour que le delegate affiche une QComboBox mis à jour.

    J'ai testé et ça marche nickel.

    Voilà ce que ça donne :

    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
    class AssignmentDelegate(QtGui.QItemDelegate):
     
        def __init__(self, owner):
            QtGui.QItemDelegate.__init__(self, owner)
     
            # #On charge TOUTES la table "Categories" dans le model
            # self.modelAssignment = QSqlTableModel(self)
            # self.modelAssignment.setTable("Assignments")
            # self.modelAssignment.select()
     
     
     
        def createEditor(self, parent, option, index):
            text = index.data(QtCore.Qt.DisplayRole).toString()
            editor = QtGui.QComboBox(parent)
            #editor.setModel(self.modelAssignment)
            editor.setModel(TVQCombo("Assignments"))
            editor.setModelColumn(TVQCombo("Assignments").fieldIndex("name"))
            indexCat = editor.findText(unicode(text))
            editor.setCurrentIndex(indexCat)
            editor.installEventFilter(self)         
            return editor
     
        def setEditorData(self, editor, index):
            value = index.data(QtCore.Qt.DisplayRole).toString()
            indexAss = editor.findText(unicode(value))
            editor.setCurrentIndex(indexAss)
     
        def setModelData(self,editor,model,index):
            value = editor.currentIndex()
            myIndex = TVQCombo("Assignments").index(value, 0)
            assignmentId = TVQCombo("Assignments").data(myIndex, 0).toInt()[0]
            #Enregistrement
            model.setData(index, QtCore.QVariant(assignmentId))
     
            #En cas de virement, on doit mettre à jour les deux enregistrements.
            row = index.row()
            if model.index(row, 14).data().toInt()[1] == True:
                idVirement = model.index(row, 14).data().toInt()[0]
                query = QSqlQuery()
                query.exec_('UPDATE Operations\
                             SET assignment_id = \"'+str(assignmentId)+'\"\
                             WHERE (virement_id = '+str(idVirement)+')')
                #print query.lastError().text()
            ####################################################################
    et ailleurs j'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def TVQCombo(name):
        #On charge TOUTES la table "Accounts" dans le model
        model = QSqlTableModel()
        model.setTable(name)
        model.setSort(5,0)
        model.select()
        return model
    Je ne sais pas si c'est exactement à çà que tu pensais (je ne crois pas vu que tu parlais des SIGNAUX, mais étant débutants, j'ai encore bcp de problème avec les slots et signaux… J'espère que ma solution n'est pas trop sale lol
    En tout cas merci

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

Discussions similaires

  1. erreur segmentation fault à l'execution
    Par g.abdou dans le forum Réseau
    Réponses: 3
    Dernier message: 18/02/2011, 01h56
  2. Traiter une erreur "Segmentation Fault"
    Par Looney dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2009, 06h51
  3. erreur "Segmentation Fault" lors de l'import d'un dump
    Par farenheiit dans le forum Import/Export
    Réponses: 13
    Dernier message: 28/11/2007, 10h17
  4. Réponses: 2
    Dernier message: 08/04/2007, 17h23
  5. [erreur] Segmentation fault
    Par fveysseire dans le forum C
    Réponses: 11
    Dernier message: 15/06/2006, 14h44

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