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 :

Crash en testant si un QLineEdit est vide ou pas


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut Crash en testant si un QLineEdit est vide ou pas
    Bonjour à tous.

    J'ai ce programme pour lequel je souhaite tester si une valeur est renseignée dans un QlineEdit.
    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
     
     
    #include "fenprincipale.h"
     
    FenPrincipale::FenPrincipale(QWidget *parent) : QWidget(parent)
    {
        setFixedSize(300,150);
     
        QVBoxLayout *arrangementGal = new QVBoxLayout;
        arrangementGal->addWidget(groupSup());
     
        QPushButton *boutonGenerer = new QPushButton("Générer !");
        QWidget::connect(boutonGenerer, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
     
        arrangementGal->addWidget(boutonGenerer);
        this->setLayout(arrangementGal);
    }
     
     
    QGroupBox *FenPrincipale::groupSup()
    {
        QGroupBox *groupBox = new QGroupBox(tr("&Définition de la classe"));
     
        QLineEdit *m_nom = new QLineEdit;
        QLineEdit *m_classeMere = new QLineEdit;
     
        QFormLayout *layoutSup = new QFormLayout;
            layoutSup->addRow("&Nom : ", m_nom);
            layoutSup->addRow("Classe &mère : ", m_classeMere);
     
        groupBox->setLayout(layoutSup);
     
       return groupBox;
    }
     
    void FenPrincipale::ouvrirDialogue()
    {
        if (m_nom->text().isEmpty())
        {
        QMessageBox::information(this, "Fenêtre principale","Le nom est vide");
        }
        else
        {
        FenCodeGenere secondWindow("Deuxième fenêtre");
        secondWindow.exec();
        }
     
     
    }
    Le contrôle [ if (m_nom->text().isEmpty()) ] se fait lors de l'appel du slot personnalisé après avoir cliqué sur le bouton "Générer". A ce moment l'application plante, que le champ soit vide, ou pas.

    Le compilateur ne donne pas de problème et il me semble que la syntaxe est correcte.

    Pourriez-vous m'orienter sur le problème.

    Merci par avance.

    Pour info voici le fichier d'entête :
    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
     
    #ifndef FENPRINCIPALE_H
    #define FENPRINCIPALE_H
     
    #include "fencodegenere.h"
     
    //#include <QApplication>
    #include <QWidget>
    #include <QLineEdit>
    #include <QGroupBox>
    #include <QFormLayout>
    #include <QVBoxLayout>
    #include <QPushButton>
    #include <QMessageBox>
    #include <QString>
     
    class FenPrincipale : public QWidget
    {
        Q_OBJECT
    public:
        explicit FenPrincipale(QWidget *parent = 0);
     
    signals:
     
    public slots:
        void ouvrirDialogue();
     
     
    private:
        QGroupBox *groupSup();
        QLineEdit *m_nom;
        QString m_texte;
     
    };
     
    #endif // FENPRINCIPALE_H

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    En continuant mes recherches sur le net, j'ai trouvé la solution sur un autre site.

    la bonne formulation pour l'initialisation de la variable m_nom est ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_nom = new QLineEdit;
    je reprends l'explication donnée par Laugilus à la même problématique :

    C'est normal que ça ne marche pas.
    m_nom est détruit à la fin du constructeur, et tu souhaites le réutiliser dans une autre fonction.Il faut que ce soit un attribut.

    Dans ton header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    protected:
    QLineEdit* m_nom;
    Dans ton fichier cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    m_nom = new QLineEdit;

    Si dans ton header tu as tout de même bien déclaré m_nom comme attribut (ce que je pense vu le préfixe m_), le problème vient alors toujours du constructeur.
    En gros, voilà dans ce cas ce qui se passe, quand le constructeur est appelé :
    - il y a un attribut m_nom, jamais initialisé
    - il y a une variable m_nom, initialisé à l'adresse d'un QLineEdit.
    Lors de la sortie du constructeur, la variable est détruite, et quand tu appelles ton slot, tu appelles l'attribut non-initialisé.

    Le compilateur a 2 variables m_nom dans le constructeur, puisque tu as écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    QLineEdit* m_nom = new QLineEdit;
    Il comprend donc que tu veux créer une autre variable (la deuxième) dans un bloc (le constructeur) appelée m_nom.

    Pour éviter ça, mets juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    m_nom = new QLineEdit;
    Et il comprendra que tu veux initialiser l'attribut.

    J'espère que ce n'est pas trop confus :p

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

Discussions similaires

  1. fonction tester si une span est vide ou pas en js
    Par sajodia dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/03/2011, 16h02
  2. Set est vide ou pas ?
    Par jbaudin dans le forum VBScript
    Réponses: 1
    Dernier message: 30/08/2007, 13h57
  3. comment savoir si un dossier est vide ou pas?
    Par Amissan dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 16/02/2007, 13h31
  4. Script shell pour tester si un répertoire est vide ou pas
    Par Ito dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/10/2006, 17h44
  5. Ksh - tester si un fichier est vide ou pas?
    Par mzt.insat dans le forum Linux
    Réponses: 1
    Dernier message: 25/04/2006, 14h22

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