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

Discussion :

Impossible d'accéder à la méthode quit() de l'application

  1. #1
    Membre régulier
    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
    Points : 103
    Points
    103
    Par défaut Impossible d'accéder à la méthode quit() de l'application
    Bonjour à tous.

    Je débute le C++ en suivant le cours "Programmez avec le langage C++". J'en suis à la 3° partie consistant à utiliser Qt pour les interfaces graphiques.

    L'objet du TP est de réaliser un générateur de code de base des classes C++. Sans grande ambition, juste deux fenêtres, d'ailleurs je n'en suis pas si loin. J'ai créé la première partie du TP, jusqu'à ce point où je bloque et j'aimerais bien le solutionner avant de continuer.

    Voici mon main l'application étant dénommée "generateurDeClasse".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <QApplication>
    #include "fenprincipale.h"
     
     
    int main(int argc, char *argv[])
    {
        QApplication generateurDeClasse(argc, argv);
        FenPrincipale mainWindows;
        return generateurDeClasse.exec();
    }
    Voici l'entête de la classe fenprincipale.h (tous les include ne sont pas encore utilisés) :

    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
     
    #ifndef FENPRINCIPALE_H
    #define FENPRINCIPALE_H
     
    #include <QWidget>
    #include <QLineEdit>
    #include <QFormLayout>
    #include <QVBoxLayout>
    #include <QGroupBox>
    #include <QGridLayout>
    #include <QRadioButton>
    #include <QCheckBox>
    #include <QPushButton>
    #include <QMenu>
    #include <QDateEdit>
    #include <QTextEdit>
    #include <QDate>
    #include <stdlib.h>
     
    class FenPrincipale : public QWidget
    {
        Q_OBJECT
    public:
        explicit FenPrincipale(QWidget *parent = 0);
     
    signals:
     
    public slots:
     
    private:
     
        QGroupBox *groupSup();
        QGroupBox *groupMid();
        QGroupBox *groupInf();
    };
     
    #endif // FENPRINCIPALE_H
    Et voici le source de la classe fenprincipale.cpp :

    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
    86
    87
    88
    89
    90
    91
    92
     
    #include "fenprincipale.h"
     
    FenPrincipale::FenPrincipale(QWidget *parent) : QWidget(parent)
    {
     
        //Création d'un arrangement selon une grille de 3 lignes x 1colonne
        QGridLayout *grille = new QGridLayout;
        grille->addWidget(groupSup(), 0, 0);
        grille->addWidget(groupMid(), 1, 0);
        grille->addWidget(groupInf(), 2, 0);
     
        //Création des boutons
        QPushButton *boutonQuitter = new QPushButton("Quitter");
        QWidget::connect(boutonQuitter, SIGNAL(clicked()), generateurDeClasse, SLOT(quit()));
     
        QPushButton *boutonGenerer = new QPushButton("Générer !");
     
        //Création d'un arrangement selon une grille de 1 ligne x 4colonnes
        QGridLayout *grilleBas = new QGridLayout;
        grilleBas->addWidget(boutonQuitter,0,4);
        grilleBas->addWidget(boutonGenerer,0,3);
     
        //Création de l'arrangement principal vertical
        QVBoxLayout *layoutPrincipal = new QVBoxLayout;
     
        //Définition de l'arrangement principal
        layoutPrincipal->addLayout(grille); // Ajout du layout grille
        layoutPrincipal->addLayout(grilleBas);
     
        //On affecte l'arrangement principal à la fenêtre
        setLayout(layoutPrincipal);
     
        setWindowTitle(tr("Zero Class Generator"));
        resize(480, 600);
        show();
     
    }
    QGroupBox *FenPrincipale::groupSup()
    {
        QGroupBox *groupBox = new QGroupBox(tr("&Définition de la classe"));
     
        QLineEdit *nom = new QLineEdit;
        QLineEdit *prenom = new QLineEdit;
     
        QFormLayout *layoutSup = new QFormLayout;
            layoutSup->addRow("&Nom : ", nom);
            layoutSup->addRow("Classe &mère : ", prenom);
     
        groupBox->setLayout(layoutSup);
     
       return groupBox;
       }
     
    QGroupBox *FenPrincipale::groupInf()
    {
        QGroupBox *groupBox = new QGroupBox(tr("A&jouter des commentaires"));
        groupBox->setCheckable(true);
        groupBox->setChecked(false);
     
        QLineEdit *auteur = new QLineEdit;
        auteur->setText(getenv("USERNAME"));
        QDateEdit *creation = new QDateEdit;
        creation->setDate(QDate::currentDate());
        QTextEdit *role = new QTextEdit;
     
        QFormLayout *layoutInf = new QFormLayout;
            layoutInf->addRow("&Auteur : ", auteur);
            layoutInf->addRow("Da&te de création : ", creation);
            layoutInf->addRow("&Rôle de la classe : ",role);
        groupBox->setLayout(layoutInf);
     
        return groupBox;
    }
     
    QGroupBox *FenPrincipale::groupMid()
    {
        QGroupBox *groupBox = new QGroupBox(tr("&Options"));
    //    groupBox->setFlat(true);
        QCheckBox *checkBox1 = new QCheckBox(tr("Protéger le &header contre les inclusions multiples"));
        checkBox1->setChecked(true);
        QCheckBox *checkBox2 = new QCheckBox(tr("Générer un &constructeur par défaut"));
        checkBox2->setChecked(true);
        QCheckBox *checkBox3 = new QCheckBox(tr("Générer un &destructeur"));
        QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(checkBox1);
        vbox->addWidget(checkBox2);
        vbox->addWidget(checkBox3);
        groupBox->setLayout(vbox);
     
        return groupBox;
    }
    J'aime bien cette structure visant à appeler des fonctions dans la classe (groupSup, groupMid, groupInf) pour constituer l'organisation de la structure de la fenêtre principale.

    Bien sûr, j'ai simplement adapté l'exemple que j'ai repris de la documentation Qt. (merci à eux pour cette documentation vraiment exhaustive et compréhensible).

    Après avoir constaté le bon fonctionnement de la création de la fenêtre, j'ai voulu activer le bouton quitter. Et là, le bât blesse sur la connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QWidget::connect(boutonQuitter, SIGNAL(clicked()), generateurDeClasse, SLOT(quit()));
    L'affectation directe à l'application generateurDeClasse, génère le message d'erreur suivant :

    fenprincipale.cpp:15: erreur : 'generateurDeClasse' was not declared in this scope
    QWidget::connect(boutonQuitter, SIGNAL(clicked()), generateurDeClasse, SLOT(quit()));
    Et ça me parait tout à fait normal car dans la classe, il me semble que l'application n'est pas accessible/visible (mais je me trompe peut-être). D'ailleurs "generateurDeClasse" n'est pas proposé en auto-complétion du code. Donc il doit manquer une référence quelque-part. J'ai bien essayé avec un "this", mais ça ne fonctionne pas non plus.

    Or dans le corrigé (où l'application est dénommée qApp), l'affectation est directe, comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FenPrincipale::FenPrincipale()
    {
        // Création des layouts et des widgets
        // …
        // Connexions des signaux et des slots
        connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
    }
    Pourriez-vous m'éclairer sur la raison qui fait que ça ne fonctionne pas chez moi ?

    Par avance, merci.

  2. #2
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    Bonjour,

    Ta classe FenPrincipale ne peut pas connaitre la variable generateurDeClasse.
    Tu as de la chance car c'est l'application. Remplace generateurDeClasse par qApp ou QApplication::instance().
    Sinon il aurait fallu passer cette variable a ta classe ( Pointeur ou reference dessus membre ) ou en parametre de la fonction qui en a besoin.

    Lit la documentation : http://doc.qt.io/qt-5/qapplication.html#details
    The QApplication object is accessible through the instance() function that returns a pointer equivalent to the global qApp pointer.

    Homer J. Simpson


  3. #3
    Membre régulier
    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
    Points : 103
    Points
    103
    Par défaut
    Excellent !

    Merci beaucoup pour cette aide, je n'avais pas compris que qApp était un pointeur, je pensais que c'était un nom qui avait été utilisé dans le cadre de l'exemple. D'où ma confusion.

    Merci encore.

    PS : il me fallait aussi rajouter l'include <Qapplication> dans le header.

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

Discussions similaires

  1. Impossible d'accéder à mes méthodes/variables d'une autre clasee
    Par Vivino dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 27/04/2016, 20h33
  2. impossible d'accéder aux méthodes de l'objet document
    Par Velatus dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/08/2010, 14h24
  3. [PHP][SOAP] Impossible d'accéder à une méthode
    Par dms75 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 30/04/2009, 12h17
  4. Réponses: 6
    Dernier message: 11/11/2008, 13h20
  5. Réponses: 3
    Dernier message: 02/06/2008, 09h27

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