Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreru slot quit qApp

Sujet résolu
    4 juillet 2019 à 16:36:34

    Bjr, j'obtiens une erreur quand j'utilise ce code depuis une classe dans un autre fichier(TP zeroclassgenerator)

    QObject::connect(&quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));

    Quelqu'un pourrait m'aider?

    mainwindow.h

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QWidget> #include <QLineEdit> #include <QCheckBox> #include <QGroupBox> #include <QDateEdit> #include <QTextEdit> #include <QPushButton> #include <QFormLayout> #include <QVBoxLayout> #include <QHBoxLayout> #include <QApplication> class MainWindow : public QWidget{ Q_OBJECT public: MainWindow(); private slots: void genererCode(); private: QLineEdit name; QLineEdit parentClass; QFormLayout *defLayout, *commentLayout; QVBoxLayout *optionsLayout, *MainLayout; QHBoxLayout *bouttonLayout; QCheckBox protectionsCheckBox; QCheckBox generateConstructorCheckBox; QCheckBox generateDestructorCheckBox; QGroupBox definition, Voptions; QGroupBox groupComment; QLineEdit author; QDateEdit Vdate; QTextEdit role; QPushButton generateButton; QPushButton quitButton; }; #endif // MAINWINDOW_H
    mainwindow.cpp
    #include "mainwindow.h"
    #include <QFormLayout>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    #include <QGroupBox>
    #include <QApplication>
    
    
    
    MainWindow::MainWindow() : QWidget ()
      ,protectionsCheckBox("Proteger les headers contre les inclusions multiples")
      ,generateConstructorCheckBox("Generer un constructeur par défaut")
      ,generateDestructorCheckBox("Generer un destructeur par défaut")
      , definition("definition")
      , Voptions("Options")
      ,groupComment("Ajouter des commentaires")
      ,generateButton("Generer")
      ,quitButton("Quitter")
    
    {
        //layout initialize
        defLayout = new QFormLayout;
        commentLayout = new QFormLayout;
        optionsLayout = new QVBoxLayout;
        MainLayout = new QVBoxLayout;
        bouttonLayout = new QHBoxLayout;
    
        //definition implementation
        defLayout->addRow("&Nom :", &name);
        defLayout->addRow("Classe &mère :", &parentClass);
        definition.setLayout(defLayout);
    
    
        //options implementation
        optionsLayout->addWidget(&protectionsCheckBox);
        optionsLayout->addWidget(&generateConstructorCheckBox);
        optionsLayout->addWidget(&generateDestructorCheckBox);
        Voptions.setLayout(optionsLayout);
    
        //comment implementation
        Vdate.setDate(QDate::currentDate());
        commentLayout->addRow("Auteur :", &author);
        commentLayout->addRow("Date :", &Vdate);
        commentLayout->addRow("Rôle de la classe : ", &role);
        groupComment.setLayout(commentLayout);
        groupComment.setCheckable(true);
        groupComment.setChecked(false);
    
        //button layout set
        bouttonLayout->setAlignment(Qt::AlignRight);
        bouttonLayout->addWidget(&generateButton);
        bouttonLayout->addWidget(&quitButton);
    
        //main window implement
        setWindowTitle("VClass generator");
        MainLayout->addWidget(&definition);
        MainLayout->addWidget(&Voptions);
        MainLayout->addWidget(&groupComment);
        MainLayout->addLayout(bouttonLayout);
    
        setLayout(MainLayout);
        resize(400, 450);
    
        QObject::connect(&quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
    }
    
    void MainWindow::genererCode(){
    
    }
    
    
    main.cpp
    #include <QApplication>
    #include "engine/mainwindow.h"
    
    int main(int argc, char *argv[]){
        QApplication app(argc, argv);
        MainWindow fenetre;
    
    
        fenetre.show();
    
    
        return app.exec();
    }
    

    -
    Edité par NewShacha1 4 juillet 2019 à 17:08:14

    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2019 à 19:01:16

      Bonjour,

      Les classes dérivées de QObject/QWidget s'utilisent de préférence sous forme de pointeur, sinon c'est beaucoup plus compliqué à gérer au niveau de la destruction automatique des objets, et c'est probablement ce qui provoque le plantage.

      Avec ton code actuel, si les widgets comme les QGroupBox sont détruits avant les widgets qu'ils contiennent, ils vont tenter de détruire leurs sous-widgets eux-mêmes, et le destructeur de la classe va retenter de les détruire une seconde fois, puisque ce sont des membres non pointeurs et c'est cette double destruction qui entraîne un plantage.

      Donc, soit tu déclares tous les QObjects en tant que pointeur, en ajoutant les allocations / new nécessaires dans le .cpp, soit tu changes l'ordre de déclaration de tes objets dans la classe pour que les QGroupBox soient les premiers déclarés (lignes 34-35 en ligne 25 du .h). Ils seront alors créés en premier et détruit en dernier lors de l'appel au destructeur de la classe MainWindow, après que leurs sous-widgets aient déjà été détruits et supprimés de leur liste de sous-widgets et ils n'auront ainsi pas à les détruire. 

      • Partager sur Facebook
      • Partager sur Twitter
        5 juillet 2019 à 6:54:23

        Merci beaucoup, je l'avais déjà tester avec pointeur et ca fonctionnait bien mais je voulais surtout comprendre. La c'est plus clair.
        • Partager sur Facebook
        • Partager sur Twitter

        Erreru slot quit qApp

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown