Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de code

    5 août 2008 à 15:55:37

    Bonjour,
    Je suis en train de réaliser un programme qui permet d'éditer des évaluations type QCM.
    La fenêtre principale sert à afficher les questions créées et la fenêtre d'édition de questions (image ci-dessous) se présente comme ça :

    Image utilisateur

    Le problème c'est que quand je choisis comme type de question : "un seul choix", le prgramme affiche ça(question 1) alors que avec l'option "choix multiples", ça s'affiche correctement(question 2)

    Image utilisateur

    Voici le code :
    #ifndef DEF_W
    #define DEF_W
    
    #include <QtGui>
    #include "FenQ.h"
    
    class Window : public QMainWindow
    {
        Q_OBJECT
    
        // Méthodes
        public :
            Window();
            void fBarreMenu();
            QGroupBox *fResume();
    
        public slots :
            void sValider();
            void sAjoutQ();
            void sAjoutTextQ();
    
        // Attributs
        private :
            QGridLayout *layoutCentral;
            QWidget *zoneCentrale;
            FenQ *fen[100];
            QPushButton *ajoutQ;
            QComboBox *type;
            QComboBox *matiere;
            QLineEdit *nomProf;
            QGroupBox *resume;
            int i;
    
    };
    #endif
    


    #include "Window.h"
    
    /**CONSTRUCTEUR**/
    Window::Window():QMainWindow(), i(0)
    {
        setWindowTitle("Editeur HPEvaluator");
    
        fBarreMenu();
    
        ajoutQ = new QPushButton("Ajouter une question");
        ajoutQ->setCursor(Qt::PointingHandCursor);
        ajoutQ->setFont(QFont("HogwartsWizard", 16, QFont::Bold));
        ajoutQ->setVisible(false);
        connect(ajoutQ, SIGNAL(clicked()), this, SLOT(sAjoutQ()));
    
        zoneCentrale = new QWidget;
    
        layoutCentral = new QGridLayout;
        layoutCentral->addWidget(fResume(), 0, 0);
        layoutCentral->addWidget(ajoutQ, 1, 0, Qt::AlignCenter);
    
        zoneCentrale->setLayout(layoutCentral);
    
        setCentralWidget(zoneCentrale);
    }
    /**COMPOSANTS**/
    void Window::fBarreMenu()
    {
        QMenu *fichier = menuBar()->addMenu("&Fichier");
    
        QAction *quitter = fichier->addAction("Quitter");
        connect(quitter, SIGNAL(triggered()), qApp, SLOT(quit()));
    }
    
    QGroupBox *Window::fResume()
    {
        resume = new QGroupBox;
        resume->setFont(QFont("HogwartsWizard", 16, QFont::Bold));
    
        type = new QComboBox;
        type->addItem("Interrogation /5");
        type->addItem("Contrôle /20");
        type->addItem("Examen /100");
    
        matiere = new QComboBox;
        matiere->addItem("Potions");
        matiere->addItem("Métamorphose");
        matiere->addItem("Botanique");
        matiere->addItem("Études des Runes");
        matiere->addItem("Défense contre les Forces du Mal");
        matiere->addItem("Enchantements");
        matiere->addItem("Divination");
        matiere->addItem("Histoire de la Magie");
        matiere->addItem("Astronomie");
        matiere->addItem("Soins aux créatures magiques");
    
        nomProf = new QLineEdit;
        nomProf->setText("Anne O'Nyme");
    
        QPushButton *valider = new QPushButton("Valider");
        valider->setCursor(Qt::PointingHandCursor);
        connect(valider, SIGNAL(clicked()), this, SLOT(sValider()));
    
        QFormLayout *layoutResume = new QFormLayout;
        layoutResume->addRow("Choisir le type de l'évaluation  : ", type);
        layoutResume->addRow("Choisir la matière scolaire : ", matiere);
        layoutResume->addRow("Entrer le nom du professeur : ", nomProf);
        layoutResume->addRow("", valider);
    
        resume->setLayout(layoutResume);
    
        return resume;
    }
    
    /**METHODES**/
    
    /**ACCESSEURS**/
    
    /**SLOTS**/
    void Window::sValider()
    {
        resume->setEnabled(false);
    
    
        QGroupBox *entete = new QGroupBox("En-tête");
        entete->setFont(QFont("HogwartsWizard", 16, QFont::Bold));
    
        QLabel *textResume = new QLabel;
        textResume->setText("Type d'évaluation : "+type->currentText()+"\nMatière : "+matiere->currentText()+"\nNom du professeur : "+nomProf->text());
    
        QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(textResume);
    
        entete->setLayout(vbox);
    
        layoutCentral->addWidget(entete, 2, 0);
    
        zoneCentrale->setLayout(layoutCentral);
    
        ajoutQ->setVisible(true);
    }
    
    void Window::sAjoutQ()
    {
        i++;
        fen[i] = new FenQ[i];
        fen[i]->show();
        connect(fen[i], SIGNAL(accept()), this, SLOT(sAjoutTextQ()));
    }
    
    void Window::sAjoutTextQ()
    {
        layoutCentral->addWidget(fen[i]->newQ(i), (2+i), 0);
    
        zoneCentrale->setLayout(layoutCentral);
        fen[i]->close();
    }
    


    #ifndef DEF_FQ
    #define DEF_FQ
    
    #include <QtGui>
    
    class FenQ : public QWidget
    {
        Q_OBJECT
    
        // Méthodes
        public :
            FenQ();
            QGroupBox *newQ(int i);
    
        public slots :
            void sValider1();
            void sValider2();
    
        signals :
            void accept();
    
        // Attributs
        private :
            QLineEdit *question;
            QRadioButton *choix1;
            QRadioButton *choix2;
            QSpinBox *nbrR;
            QGridLayout *layoutQ;
            QLineEdit *reponse[4];
            QLabel *textR[4];
            QGroupBox *blocQ;
            QPushButton *valider1;
            QLabel *textQuestion;
            QLabel *textChoix;
            QLabel *textNbrR;
            QRadioButton *type1R[4];
            QCheckBox *type2R[4];
            QLabel *textReponse[4];
            QRadioButton *choixType1R[4];
            QCheckBox *choixType2R[4];
    };
    #endif
    


    #include "FenQ.h"
    
    /**CONSTRUCTEUR**/
    FenQ::FenQ():QWidget()
    {
        setWindowTitle("Éditeur de questions");
    
        blocQ = new QGroupBox(this);
        blocQ->setFont(QFont("HogwartsWizard", 16, QFont::Bold));
    
        textQuestion = new QLabel;
        textQuestion->setText("Entrer la question : ");
    
        textChoix = new QLabel;
        textChoix->setText("Choisir le type de question : ");
    
        textNbrR = new QLabel;
        textNbrR->setText("Entrer le nombre de réponses possibles : ");
    
        question = new QLineEdit;
        question->setMinimumWidth(200);
    
        choix1 = new QRadioButton("Un seul choix");
        choix1->setChecked(true);
    
        choix2 = new QRadioButton("Choix multiples");
    
        nbrR = new QSpinBox;
        nbrR->setMinimum(1);
        nbrR->setMaximum(4);
        nbrR->setButtonSymbols(QAbstractSpinBox::PlusMinus);
    
        valider1 = new QPushButton("Valider");
        valider1->setFont(QFont("HogwartsWizard", 16, QFont::Bold));
        valider1->setCursor(Qt::PointingHandCursor);
        connect(valider1, SIGNAL(clicked()), this, SLOT(sValider1()));
    
        layoutQ = new QGridLayout;
        layoutQ->addWidget(textQuestion, 0, 0);
        layoutQ->addWidget(question, 0, 1, 1, 3);
        layoutQ->addWidget(textChoix, 1, 0, 1, 2);
        layoutQ->addWidget(choix1, 1, 2, 1, 2);
        layoutQ->addWidget(choix2, 2, 2, 1, 2);
        layoutQ->addWidget(textNbrR, 3, 0, 1,3);
        layoutQ->addWidget(nbrR, 3, 3, 1, 1);
        layoutQ->addWidget(valider1, 4, 0, 1, 4);
    
        blocQ->setLayout(layoutQ);
    
        QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(blocQ);
    
        setLayout(vbox);
    
    }
    /**ACCESSEURS**/
    
    /**METHODES**/
    QGroupBox *FenQ::newQ(int j)
    {
        int i = 0;
        QGroupBox *bloc = new QGroupBox("Question "+QString::number(j));
        bloc->setFont(QFont("HogwartsWizard", 16, QFont::Bold));
    
        QLabel *q = new QLabel;
        q->setText(question->text());
    
        QGridLayout *layoutQ = new QGridLayout;
        layoutQ->addWidget(q, 0, 0);
    
        if (choix1->isChecked())
        {
            while (i<(nbrR->value())){
                i++;
                choixType1R[i] = new QRadioButton[i];
    
                textReponse[i] = new QLabel[i];
    
                textReponse[i]->setText(reponse[i]->text());
    
                if (type1R[i]->isChecked())
                {
                    choixType1R[i]->setChecked(true);
                }
    
                layoutQ->addWidget(choixType1R[i], i, 0);
                layoutQ->addWidget(textReponse[i], i, 1);
            }
        }
    
        if (choix2->isChecked())
        {
            while (i<(nbrR->value())){
                i++;
                choixType2R[i] = new QCheckBox[i];
    
                textReponse[i] = new QLabel[i];
    
                textReponse[i]->setText(reponse[i]->text());
    
                if (type2R[i]->isChecked())
                {
                    choixType2R[i]->setChecked(true);
                }
    
                layoutQ->addWidget(choixType2R[i], i, 0);
                layoutQ->addWidget(textReponse[i], i, 1);
            }
        }
    
        bloc->setLayout(layoutQ);
    
        return bloc;
    }
    /**SLOTS**/
    void FenQ::sValider1()
    {
        int i=0;
        textQuestion->setEnabled(false);
        textNbrR->setEnabled(false);
        textChoix->setEnabled(false);
        nbrR->setEnabled(false);
        choix1->setEnabled(false);
        choix2->setEnabled(false);
        valider1->setEnabled(false);
        question->setEnabled(false);
    
        if (choix1->isChecked())
        {
            while (i<(nbrR->value())){
                i++;
                textR[i] = new QLabel[i];
                textR[i]->setText("Entrer votre reponse "+QString::number(i)+" : ");
    
                reponse[i] = new QLineEdit[i];
    
                type1R[i] = new QRadioButton[i];
    
                layoutQ->addWidget(type1R[i], (4+i), 0);
                layoutQ->addWidget(textR[i], (4+i), 1);
                layoutQ->addWidget(reponse[i], (4+i), 2, 1, 2);
                blocQ->setLayout(layoutQ);
            }
        }
    
    
        if (choix2->isChecked())
        {
            while (i<(nbrR->value())){
                i++;
                textR[i] = new QLabel[i];
                textR[i]->setText("Entrer votre reponse "+QString::number(i)+" : ");
    
                reponse[i] = new QLineEdit[i];
    
                type2R[i] = new QCheckBox[i];
    
                layoutQ->addWidget(type2R[i], (4+i), 0);
                layoutQ->addWidget(textR[i], (4+i), 1);
                layoutQ->addWidget(reponse[i], (4+i), 2, 1, 2);
                blocQ->setLayout(layoutQ);
            }
        }
    
    
        QPushButton *valider2 = new QPushButton("Valider");
        valider2->setFont(QFont("HogwartsWizard", 16, QFont::Bold));
        valider2->setCursor(Qt::PointingHandCursor);
        connect(valider2, SIGNAL(clicked()), this, SLOT(sValider2()));
        layoutQ->addWidget(valider2, (5+i), 0, 1, 3);
        blocQ->setLayout(layoutQ);
    }
    
    void FenQ::sValider2()
    {
        emit accept();
    }
    


    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      5 août 2008 à 20:20:22

      Citation : Bachir ElMagnifico

      et ou est le probleme?


      Il est là !!! >_<

      Citation : moi

      Le problème c'est que quand je choisis comme type de question : "un seul choix", le prgramme affiche ça(question 1) alors que avec l'option "choix multiples", ça s'affiche correctement(question 2)
      • Partager sur Facebook
      • Partager sur Twitter
        5 août 2008 à 20:35:15

        Si tu pouvais mettre le main.cpp de ton programme, ce serait beaucoup plus facile pour nous de te répondre :lol:

        Là on a deux gros objets mais aucun moyen de se repérer dedans, comment veux-tu qu'on puisse t'aider ? :p
        • Partager sur Facebook
        • Partager sur Twitter
          5 août 2008 à 21:31:05

          oui, mais qu'est ce qu'il devrait faire normalement
          • Partager sur Facebook
          • Partager sur Twitter
            6 août 2008 à 12:40:40

            @Bachir ElMagnifico : ben il devrait renvoyer une image du type :

            Pour un seul choix :

            Question 1 :

            - Réponse 1.

            Une question, au minimum une réponse.

            Mais là il affiche juste :

            Question 1 :

            Ca n'a aucun sens ^^

            Sinon je maintiens que sans le main on peut pas t'aider :p
            • Partager sur Facebook
            • Partager sur Twitter
              6 août 2008 à 13:02:08

              Voilà le main :
              /* HPEvaluation
              Date de création : lundi 4 août 2008
              Dernière modification : lundi 4 août 2008
              */
              
              #include <QApplication>
              #include <QPlastiqueStyle>
              #include "Window.h"
              
              
              int main(int argc, char *argv[])
              {
                  QApplication app(argc, argv);
              
                  Window w;
                  QApplication::setStyle(new QPlastiqueStyle);
                  w.setStyleSheet("QMainWindow {background-color: white;}");
                  w.show();
              
                  return app.exec();
              }
              
              • Partager sur Facebook
              • Partager sur Twitter

              Problème de code

              × 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