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

Qt Discussion :

QTableWidget et erreur de segmentation


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut QTableWidget et erreur de segmentation
    Bonjour,

    Je suis en train de faire un petit logiciel utilisant une base de données SQLite. J'affiche les informations dans un QTableWidget. Je suis en train d'implémenter une fonction recherche (qui me pose problème). Au début de cette fonction, je veux effacer le contenu du QTableWidget et mettre le nombre de lignes à 0. Le problème vient de ces deux appelles de fonctions qui me font des erreurs de segmentation et je ne comprend pas pourquoi.
    J'effectue ces actions régulièrement pour recharger la base de donnée et elles ne posent aucun problème.

    J'utilise Qt 4.6 et Qt Creator 1.3, l'interface graphique a été faite avec Qt Creator.

    Voici le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ui->tableWidget_list->clear();
    ui->tableWidget_list->setRowCount(0);

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 97
    Points : 235
    Points
    235
    Par défaut
    Serait-il possible d'avoir un peu plus de ligne de code. Tu es sur précisément que l'erreur de segmentation se déroule sur les deux lignes que tu as mis ?

  3. #3
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Pour compléter le commentaire précédent, je rajouterais qu'en général une erreur de segmentation est dût à une variable mal ou pas initialisée. Elle pointe n'importe où en mémoire, et ça crash. Je doute un peu des lignes que tu cites, mais peut être aussi qu'au passage de ces lignes ton "ui" n'existe plus, qu'elle est fermée. Ce qui expliquerait la segFault...

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    La variable "ui" n'est détruite qu'à la fermeture du programme donc je ne pense pas que cela vienne de ça : le delete est présent que dans le destructeur de la fenêtre principale.

    Pour le code, voici les deux fonctions utilisant le code précédemment mis :
    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
    void MainWindow::load_database()
    {
        ui->tableWidget_list_log->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
        ui->tableWidget_list_log->clear();
        ui->tableWidget_list_log->setRowCount(0);
        QStringList labels;
        labels << QString::fromUtf8("Nom") << QString::fromUtf8("Numero");
        ui->tableWidget_list_log->setHorizontalHeaderLabels(labels);
     
        QSqlQuery query(*db);
        query.exec("SELECT title, number FROM table ORDER BY title, number");
        while (query.next())
        {
            // Creation des items
            QTableWidgetItem *titleItem = new QTableWidgetItem(query.value(0).toString());
            titleItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
            QTableWidgetItem *numberItem = new QTableWidgetItem(query.value(1).toString());
            numberItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
     
            // Mise a jour de la liste d'items
            int row = ui->tableWidget_list_log->rowCount();
            ui->tableWidget_list_log->insertRow(row);
            ui->tableWidget_list_log->setItem(row, 0, titleItem);
            ui->tableWidget_list_log->setItem(row, 1, numberItem);
        }
    }
     
    // Fonction recherche
    void MainWindow::search(QString searchText)
    {
        ui->tableWidget_list_log->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
        ui->tableWidget_list_log->clear();
        ui->tableWidget_list_log->setRowCount(0);
        QStringList labels;
        labels << QString::fromUtf8("Nom") << QString::fromUtf8("Numero");
        ui->tableWidget_list_log->setHorizontalHeaderLabels(labels);	//*/
     
        QSqlQuery query(*db);
        query.prepare("SELECT * FROM table WHERE title LIKE '%" + searchText + "%'");
        query.exec();
     
        while (query.next())
        {
            // Creation des items
            QTableWidgetItem *titleItem = new QTableWidgetItem(query.value(0).toString());
            titleItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
            QTableWidgetItem *numberItem = new QTableWidgetItem(query.value(1).toString());
            numberItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
     
            // Mise a jour de la liste d'items
            int row = ui->tableWidget_list_log->rowCount();
            ui->tableWidget_list_log->insertRow(row);
            ui->tableWidget_list_log->setItem(row, 0, titleItem);
            ui->tableWidget_list_log->setItem(row, 1, numberItem);
        }
    }
    La fonction load_database fonctionne sans problème et la fonction recherche de me pose problème.
    Ce qui me fait dire que c'est ces deux lignes qui me pose problème est le fait qu'en les commentant, je n'ai plus d'erreur de segmentation.

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 97
    Points : 235
    Points
    235
    Par défaut
    place la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDebug() << ui->tableWidget_list_log;
    dans chacune des fonctions et regarde si elles ont la même adresse.

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Elles ont bien la même adresse mais il semblerait que la fonction de recherche soit appelée 2 fois. Voici la sortie :

    QTableWidget(0x8a43ad0, name = "tableWidget_list_log")
    QTableWidget(0x8a43ad0, name = "tableWidget_list_log")
    QTableWidget(0x8a43ad0, name = "tableWidget_list_log")
    Erreur de segmentation

    Le premier correspond à la fonction load_database et les deux autres à la fonction recherche. Je viens de vérifier, le connect n'est pas doublé : si je le commente, la fonction recherche n'est plus appelée.

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 97
    Points : 235
    Points
    235
    Par défaut
    Pourquoi est elle appelée deux fois, ca c'est la grande question. Je pense que si tu trouves le pourquoi ca résoudra le problème. Sinon faudra fournir une plus grosse partie de ton code sur le forum pour éventuellement trouver l'erreur.

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Le problème venait bien de là. J'ai modifié le connect et tout est rentré dans l'ordre.

    Merci à tous pour votre aide.

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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