Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de header Qt

    13 avril 2018 à 9:25:44

    Bonjour,

    Je vous explique ma situation :

    J'ai, dans mon projet, une fenêtre principale "FenProjet" héritant de QMainWindow, une fenêtre secondaire "Fen_programmation" héritant de QDialogue qui s'ouvre lors d'un clic sur un bouton d'un toolbar et des widgets persos. 

    Mon problème se trouve au niveau des headers de FenProjet et de Fen_programmation. 

    1er problème : Dans Fen_programmation je n'utilise pas FenProjet seulement si je n'include pas "FenProjet.h" le programme compile correctement mais quitte de manière imprévue au lancement. Je ne comprends absolument pas pourquoi. 

    2eme problème : Etant donné le problème 1, j'inclue donc "FenProjet.h" dans Fen_programmation. Dans FenProjet j'ai besoin de créer un objet Fen_programmation, j'y include donc "Fen_programmation.h". Le problème est lorsque je déclare l'objet dans le header de FenProjet le compilateur me dit "unknown type name 'Fen_programmation' ". 

    J'ai lu que ce problème est du aux références croisées, je suis donc passé par des déclarations anticipées. La compilation se passe mais le programme quitte de manière imprévue au lancement. 

    Je veux bien un peu d'aide je suis perdu :D 

    Je ne vous mets pas le code pour le moment car il est un peu long et ne sachant pas d'ou vient l'erreur je ne peux pas le réduire. 

    • Partager sur Facebook
    • Partager sur Twitter
      13 avril 2018 à 9:38:33

      Mets ton code, on risque d'avoir du mal de t'aider sans :/
      • Partager sur Facebook
      • Partager sur Twitter

      « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
      D. Mendeleïev

        13 avril 2018 à 9:41:41

        Salut, 

        tu n'as pas besoin d'inclure " FenProjet " dans " FenProgrammation " car cette dernière n'utilise pas les éléments(propriété) de FenProjet, par contre tu es obligé d'inclure FenProgammation dans FenProjet par ce que FenProjet fait appel à FenProgrammation.(désolé pour la répétition :-° ).

        Nota: est ce que dans ton FenProjet.cpp lors de l'appel de l'objet du type QDialog(petite ou seconde fenêtre) l'as-tu déclaré comme étant modal ?

        puis simplifie soit crée un petit projet dont tu utilise le même principe(fenêtre N°1 appel fenêtre N°2) pour qu'on sache où t'aider  

        -
        Edité par EL-jos 13 avril 2018 à 9:45:56

        • Partager sur Facebook
        • Partager sur Twitter

        Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .

          13 avril 2018 à 10:21:10

          Je vous mets mon code en essayant de le simplifier :D

          FenProjet.h

          #ifndef HEADER_FENPROJET
          #define HEADER_FENPROJET
          
          #include <QMenuBar>
          #include <QToolBar>
          #include <QMessageBox>
          #include <QtWidgets>
          #include <QObject>
          #include <QMainWindow>
          #include <QSerialPort>
          #include <QSerialPortInfo>
          #include <QDebug>
          #include <QtMath>
          #include "seringue.h"
          #include "slot_voies.h"
          #include "fen_programmation.h"
          
          class QAction;
          
          class FenProjet : public QMainWindow
          {
              Q_OBJECT
          
              public:
              FenProjet();
          
              public slots:
              ...
          
              private slots:
              void connexion();
              void modeProgrammation();
          
              private:
              void createAction();
              void createTool();
             
              ... 
          
              QValidator *validator;
              Slot_voies *slotVoies;
              Seringue *seringue;
              fen_programmation *fen_prog;  // declaration ici !
          
              ...
          
          };
          
          #endif
          

          FenProjet.cpp

          #include "fenprojet.h"
          #include <QAction>
          
          FenProjet::FenProjet()
          {
              ...
              QObject::connect(fen_prog, SIGNAL(emissionDepuisfen_prog()), this, SLOT(connexion()));
          }
          
          void FenProjet::connexion()
          {
              arduino_is_available = false;
              arduino_port_name = "";
              arduino = new QSerialPort;
          
              foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
              {
                      if(serialPortInfo.hasVendorIdentifier() && serialPortInfo.hasProductIdentifier())
                      {
                          if(serialPortInfo.vendorIdentifier() == arduino_uno_vendor_id)
                          {
                              if(serialPortInfo.productIdentifier() == arduino_uno_product_id)
                              {
                                  arduino_port_name = serialPortInfo.portName();
                                  arduino_is_available = true;
                              }
                          }
                      }
                  }
          
              if(arduino_is_available)
              {
                     // open and configure the serialport
                     arduino->setPortName(arduino_port_name);
                     arduino->open(QSerialPort::ReadWrite);
                     arduino->setBaudRate(QSerialPort::Baud115200);
                     arduino->setDataBits(QSerialPort::Data8);
                     arduino->setParity(QSerialPort::NoParity);
                     arduino->setStopBits(QSerialPort::OneStop);
                     arduino->setFlowControl(QSerialPort::NoFlowControl);
                     QMessageBox::information(this,"info port","connexion done");
                     QMessageBox::information(this, "Info Port", "Connection with Arduino is done");
               }
              else
              {
                     // give error message if not available
                     QMessageBox::warning(this, "Port error", "Couldn't find the Arduino!");
               }
          }
          
          void FenProjet::createAction()
          {
              actionConnexion = new QAction(tr("&Connexion"), this);
              connect(actionConnexion, SIGNAL(triggered()), this, SLOT(connexion()));
          
              actionMode_Prog = new QAction(tr("&Programmation"),this);
              connect(actionMode_Prog, SIGNAL(triggered()), this, SLOT(modeProgrammation()));
          }
          void FenProjet::modeProgrammation()
          {
              fen_prog = new fen_programmation();  //création ici !
              fen_prog->show();
          }
          
          void FenProjet::createTool()
          {
              toolBarFichier = addToolBar("Connexion");
              toolBarFichier->addAction(actionConnexion);
              toolBarFichier->addAction(actionMode_Prog);
          }

          Fen_programmation.h

          #ifndef FEN_PROGRAMMATION_H
          #define FEN_PROGRAMMATION_H
          
          #include <QtWidgets>
          #include <QObject>
          #include <QDialog>
          #include <QDebug>
          #include <QFile>
          #include <QTextStream>
          #include "slot_voies.h"
          #include "seringue.h"
          #include "fenprojet.h"
          
          class fen_programmation : public QDialog
          {
              Q_OBJECT
          
              public:
          
                  fen_programmation();
          
                  QGroupBox *action1();
                  QGroupBox *action2();
                  QGroupBox *action3();
                  QGroupBox *action4();
                  QGroupBox *action5();
                  QHBoxLayout *repetition();
                  QHBoxLayout *boutons();
                  QPushButton *ouvrir;
                  QPushButton *enregistrer;
                  QPushButton *lancer;
          
                  QGroupBox *action1GrpBox;
                  QGroupBox *action2GrpBox;
                  QGroupBox *action3GrpBox;
                  QGroupBox *action4GrpBox;
                  QGroupBox *action5GrpBox;
          
                  QComboBox *choixAction1;
                  QComboBox *choixAction2;
                  QComboBox *choixAction3;
                  QComboBox *choixAction4;
                  QComboBox *choixAction5;
          
                  QLineEdit *mouvAction1;
                  QLineEdit *mouvAction2;
                  QLineEdit *mouvAction3;
                  QLineEdit *mouvAction4;
                  QLineEdit *mouvAction5;
          
                  QLineEdit *vitesseAction1;
                  QLineEdit *vitesseAction2;
                  QLineEdit *vitesseAction3;
                  QLineEdit *vitesseAction4;
                  QLineEdit *vitesseAction5;
          
                  QPushButton *validerAction1;
                  QPushButton *validerAction2;
                  QPushButton *validerAction3;
                  QPushButton *validerAction4;
                  QPushButton *validerAction5;
          
                  QLineEdit *nombreRepetiton;
          
                  Slot_voies *slotVoiesAction1;
                  Slot_voies *slotVoiesAction2;
                  Slot_voies *slotVoiesAction3;
                  Slot_voies *slotVoiesAction4;
                  Slot_voies *slotVoiesAction5;
          
                  Seringue *seringue;
          
                  QValidator *validator;
          
                  QString sequence1;
                  QString sequence2;
                  QString sequence3;
                  QString sequence4;
                  QString sequence5;
          
          
              public slots :
          
                  void bouton_ValiderAction1();
                  void bouton_ValiderAction2();
                  void bouton_ValiderAction3();
                  void bouton_ValiderAction4();
                  void bouton_ValiderAction5();
          
                  void etatBouton_ValiderAction1();
                  void etatBouton_ValiderAction2();
                  void etatBouton_ValiderAction3();
                  void etatBouton_ValiderAction4();
                  void etatBouton_ValiderAction5();
          
                  void ecriture_sequences();
                  void generation_sequence();
                  void lancer_sequences();
          
                  QString calculNombrePas(float volumeADeplacer);
          
          signals:
              void emissionDepuisfen_prog();
          };
          
          #endif // FEN_PROGRAMMATION_H
          

          fen_programmation.cpp

          #include "fen_programmation.h"
          
          fen_programmation::fen_programmation()
          {
             ...
          }
          
          void fen_programmation::lancer_sequences()
          {
              if(action1GrpBox->isFlat() == 1)  //Si groupe boxe est validé (n'a plus le fond gris)
              {
                  emit emissionDepuisfen_prog();
          
                  if(action2GrpBox->isFlat() == 1)
                  {
          
          
                      if(action3GrpBox->isFlat() == 1)
                      {
          
                          if(action4GrpBox->isFlat() == 1)
                          {
          
          
                              if(action5GrpBox->isFlat() == 1)
                              {
          
                              }
                          }
                      }
                  }
              }
          
          }

          Dans fen_programmation, si je n'include pas FenProjet mon programme quitte au lancement ...



          • Partager sur Facebook
          • Partager sur Twitter
            13 avril 2018 à 10:43:33

            Des questions comme ça :
            Quand tu dis "quitte au lancement" => Une erreur s'affiche? Quelque chose?
            Tu as utilisé un débugueur? Histoire de voir ou le programme s'arrête?
            • Partager sur Facebook
            • Partager sur Twitter

            « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
            D. Mendeleïev

              13 avril 2018 à 11:14:16

              Honte à moi je ne sais pas utiliser le debugger ....

              Il y a aucune erreur de compilation 

              • Partager sur Facebook
              • Partager sur Twitter
                13 avril 2018 à 12:16:22

                Bonjour,

                je vois pas tout le code ("seringue.h"), mais il y a deux instances de seringue dans ton code. Une dans "fen_projet" et autre dans "fen_programation"? 

                fen_programation, construit une deuxième instance de seringue dans fen_projet...

                C'est nécessaire?

                -
                Edité par Tringola 13 avril 2018 à 15:12:45

                • Partager sur Facebook
                • Partager sur Twitter
                Dis-toi bien que si quelque chose devait me manquer, ce ne serait plus le vin, ce serait l'ivresse !Jean Gabin, Un Singe en Hiver
                  13 avril 2018 à 14:37:40

                  Salut,

                  Pas de bol, tu as justement supprimé du code les parties qui comportent très certainement ton erreur...

                  Pourrais tu nous donner le code complet des constructeurs de fen_projet et de fen_programmation ?

                  Car ma boule de crystal, qui veut bien fonctionner pour une fois, m'indique qu'il y a 90% de chances que le problème se situe à ce niveau: tu créerais des variables locales dans constructeur dont le nom serait le même que ceux des données membres de tes classes que je n'en serais pas plus étonné que cela :D

                  -
                  Edité par koala01 13 avril 2018 à 14:38:20

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                    13 avril 2018 à 16:08:53

                    Bonjour,

                    Je comprends pas bien votre question.

                    "Seringue" est une classe qui hérite QGraphicsView. Je l'utilise dans FenProjet et dans fen_programmation.

                    Vous voulez dire qu'il est inutile d'include "seringue.h" dans "fen_programmation.h" etant donné qu'il est deja include dans "FenProjet.h" ? 

                    Je vous mets le code des constructeurs en entier :D

                    fen_programmation::fen_programmation()
                    {
                        validator = new QDoubleValidator(0, 1000, 3, this);
                        validator->setLocale(QLocale::C);
                    
                        seringue = new Seringue;
                    
                        QVBoxLayout *layoutVerticalPrincipal = new QVBoxLayout;
                    
                        layoutVerticalPrincipal -> addWidget(seringue->typeSeringue);
                        layoutVerticalPrincipal -> addWidget(action1());
                        layoutVerticalPrincipal -> addWidget(action2());
                        layoutVerticalPrincipal -> addWidget(action3());
                        layoutVerticalPrincipal -> addWidget(action4());
                        layoutVerticalPrincipal -> addWidget(action5());
                        layoutVerticalPrincipal -> addLayout(repetition());
                        layoutVerticalPrincipal -> addLayout(boutons());
                    
                        //Set du layout grille
                        setLayout(layoutVerticalPrincipal);
                    
                        //Ajout de l'entete de fenetre
                        setWindowTitle("Mode Programmation");
                    
                        //connection
                        QWidget::connect(validerAction1,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction1()));
                        QWidget::connect(validerAction2,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction2()));
                        QWidget::connect(validerAction3,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction3()));
                        QWidget::connect(validerAction4,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction4()));
                        QWidget::connect(validerAction5,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction5()));
                    
                        QWidget::connect(mouvAction1,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction1()));
                        QWidget::connect(vitesseAction1,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction1()));
                        QWidget::connect(slotVoiesAction1->voie1RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction1()));
                        QWidget::connect(slotVoiesAction1->voie2RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction1()));
                        QWidget::connect(slotVoiesAction1->voie3RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction1()));
                    
                        QWidget::connect(mouvAction2,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction2()));
                        QWidget::connect(vitesseAction2,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction2()));
                        QWidget::connect(slotVoiesAction2->voie1RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction2()));
                        QWidget::connect(slotVoiesAction2->voie2RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction2()));
                        QWidget::connect(slotVoiesAction2->voie3RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction2()));
                    
                        QWidget::connect(mouvAction3,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction3()));
                        QWidget::connect(vitesseAction3,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction3()));
                        QWidget::connect(slotVoiesAction3->voie1RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction3()));
                        QWidget::connect(slotVoiesAction3->voie2RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction3()));
                        QWidget::connect(slotVoiesAction3->voie3RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction3()));
                    
                        QWidget::connect(mouvAction4,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction4()));
                        QWidget::connect(vitesseAction4,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction4()));
                        QWidget::connect(slotVoiesAction4->voie1RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction4()));
                        QWidget::connect(slotVoiesAction4->voie2RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction4()));
                        QWidget::connect(slotVoiesAction4->voie3RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction4()));
                    
                        QWidget::connect(mouvAction5,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction5()));
                        QWidget::connect(vitesseAction5,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction5()));
                        QWidget::connect(slotVoiesAction5->voie1RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction5()));
                        QWidget::connect(slotVoiesAction5->voie2RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction5()));
                        QWidget::connect(slotVoiesAction5->voie3RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction5()));
                    
                        QWidget::connect(enregistrer,SIGNAL(clicked(bool)),this,SLOT(generation_sequence()));
                        QWidget::connect(lancer,SIGNAL(clicked(bool)),this,SLOT(lancer_sequences()));
                    
                    
                    }
                    FenProjet::FenProjet()
                    {
                        QWidget *zoneCentrale = new QWidget;
                    
                        QMenu *menuFichier = menuBar()->addMenu("&Fichier");
                        menuFichier->addAction("Test");
                    
                        QMenu *menuEdition = menuBar()->addMenu("&Edition");
                        menuEdition->addAction("Test");
                    
                        createAction();
                        createTool();
                    
                    //-----------Creation Widgets perso-------------//
                    
                            seringue = new Seringue;
                            slotVoies = new Slot_voies;
                    
                     //----------Création des Widgets---------------//
                        validator = new QDoubleValidator(0, 1000, 3, this);
                        validator->setLocale(QLocale::C);   //Ajoute le . dans les nombres à virgule
                    
                        volume = new QLineEdit;
                        volume->setText(QString::number(seringue->volumeMax));
                        QLabel *labVolume = new QLabel(tr("Volume (mL)"));
                        vitesseI = new QLineEdit;
                        vitesseI->setText(vitesseDeplacement);
                        QLabel *labVitesseI = new QLabel(tr("Vitesse (mm/s)"));
                        temperatureI = new QLineEdit;
                        QLabel *labTemperatureI = new QLabel(tr("Température (°C)"));
                        valeur_injecter = new QLineEdit;
                        QLabel *labInjecter = new QLabel(tr("Injecter (mL)"));
                        bouton51 = new QPushButton(tr("Send"));
                        valeur_aspirer = new QLineEdit;
                        QLabel *labAspirer = new QLabel(tr("Aspirer (mL)"));
                        bouton52 = new QPushButton(tr("Send"));
                        valeur_vitesseA = new QLineEdit;
                        QLabel *labVitesseA = new QLabel(tr("Vitesse (mm/s)"));
                        bouton53 = new QPushButton(tr("Send"));
                        valeur_temperatureA = new QLineEdit;
                        QLabel *labTemperatureA = new QLabel(tr("Température (°C)"));
                        bouton54 = new QPushButton(tr("Send"));
                    
                    //-----------Connexion Fonction--------------------//
                    
                        QObject::connect(bouton51, SIGNAL(clicked()), this, SLOT(injecter()));          // relie le clic du bouton send injecter à la fonction injecter
                        QObject::connect(bouton52, SIGNAL(clicked()), this, SLOT(aspirer()));           // relie le clic du bouton send aspirer à la fonction aspirer
                        QObject::connect(bouton53, SIGNAL(clicked()), this, SLOT(new_vitesse()));           // relie le clic du bouton send vitesse à la fonction new_vitesse
                        QObject::connect(bouton54, SIGNAL(clicked()), this, SLOT(new_temperature()));       // relie le clic du bouton send temperature à la fonction new_temperature
                        QObject::connect(slotVoies,SIGNAL(signalVersGeneTram(QString)),this,SLOT(generationTrameChangementVoie(QString)));
                        QObject::connect(seringue, SIGNAL(signalVersVolume()),this,SLOT(changementSeringue()));
                        QObject::connect(fen_prog, SIGNAL(emissionDepuisfen_prog()), this, SLOT(connexion()));
                    
                    //------------Restriction sur les champs de saisi------------//
                        volume->setReadOnly(1);
                        vitesseI->setReadOnly(1);
                        temperatureI->setReadOnly(1);
                    
                        valeur_injecter->setValidator(validator);
                        valeur_aspirer->setValidator(validator);
                        valeur_vitesseA->setValidator(validator);
                        valeur_temperatureA->setValidator(validator);
                    
                    //-----------Gestion des layouts------------------//
                        QVBoxLayout *seringueLayoutV = new QVBoxLayout;     //Création Layout Parent
                            QHBoxLayout *seringueLayoutH = new QHBoxLayout;     //Création Layout fille 1
                                layoutDroite1 = new QVBoxLayout;        //Création Layout fille 2 droite (Info et Action)
                                layoutGauche1 = new QVBoxLayout;        //Création Layout fille 2 gauche (Seringue et trois voies)
                                    layoutInformation = new QGroupBox(tr("Information"));   //Création Layout fille 3 (Info)
                                        QVBoxLayout *layoutVerticalInformation = new QVBoxLayout;   //Création Layout fille 4 Info (label et Line)
                                        layoutVerticalInformation->addWidget(labVolume);
                                        layoutVerticalInformation->addWidget(volume);
                                        layoutVerticalInformation->addWidget(labVitesseI);
                                        layoutVerticalInformation->addWidget(vitesseI);
                                        layoutVerticalInformation->addWidget(labTemperatureI);
                                        layoutVerticalInformation->addWidget(temperatureI);
                                    layoutInformation->setLayout(layoutVerticalInformation);        //Insertion layout fille 4 -> fille 3 (Info)
                    
                                    layoutAction = new QGroupBox(tr("Action"));             //Création Layout fille 3 (Action)
                                        QVBoxLayout *layoutVerticalAction = new QVBoxLayout;        //Création Layout fille 4 Action (Label et layout fille 4)
                                        layoutVerticalAction->addWidget(labInjecter);
                                            QHBoxLayout *layout4Horizontal1 = new QHBoxLayout;      //Création Layout fille 5-1 (line et boutton)
                                            layout4Horizontal1->addWidget(valeur_injecter);
                                            layout4Horizontal1->addWidget(bouton51);
                                        layoutVerticalAction->addLayout(layout4Horizontal1);        //Insertion layout fille 5-1 -> fille 4
                    
                                        layoutVerticalAction->addWidget(labAspirer);
                                            QHBoxLayout *layout4Horizontal2 = new QHBoxLayout;      //Création Layout fille 5-2 (line et boutton)
                                            layout4Horizontal2->addWidget(valeur_aspirer);
                                            layout4Horizontal2->addWidget(bouton52);
                                        layoutVerticalAction->addLayout(layout4Horizontal2);        //Insertion layout fille 5-2 -> fille 4
                    
                                        layoutVerticalAction->addWidget(labVitesseA);
                                            QHBoxLayout *layout4Horizontal3 = new QHBoxLayout;      //Création Layout fille 5-3 (line et boutton)
                                            layout4Horizontal3->addWidget(valeur_vitesseA);
                                            layout4Horizontal3->addWidget(bouton53);
                                        layoutVerticalAction->addLayout(layout4Horizontal3);        //Insertion layout fille 5-3 -> fille 4
                    
                                        layoutVerticalAction->addWidget(labTemperatureA);
                                            QHBoxLayout *layout4Horizontal4 = new QHBoxLayout;      //Création Layout fille 5-4 (line et boutton)
                                            layout4Horizontal4->addWidget(valeur_temperatureA);
                                            layout4Horizontal4->addWidget(bouton54);
                                        layoutVerticalAction->addLayout(layout4Horizontal4);        //Insertion layout fille 5-4 -> fille 4
                    
                                    layoutAction->setLayout(layoutVerticalAction);          //Insertion layout fille 4 -> fille 3 (Action)
                    
                                layoutDroite1->addWidget(layoutInformation);                //Insertion layout fille 3 (Info) -> fille 2 (Droite)
                                layoutDroite1->addWidget(layoutAction);                     //Insertion layout fille 3 (Action) -> fille 2 (Droite)
                    
                                layoutGauche1->addLayout(slotVoies->slot_voiesGrpBox);
                                layoutGauche1->addWidget(seringue->vue_seringue);           //Insertion layout animation seringue 1 -> fille 2 (Gauche)
                    
                            seringueLayoutH->addLayout(layoutGauche1);                      //Insertion layout fille 2 (Gauche) -> fille 1
                            seringueLayoutH->addLayout(layoutDroite1);                      //Insertion layout fille 2 (Droite) -> fille 1
                    
                        seringueLayoutV->addWidget(seringue->typeSeringue);                           //Insertion widget -> Parent
                        seringueLayoutV->addLayout(seringueLayoutH);                        //Insertion layout fille 1 -> Parent
                    
                        zoneCentrale->setLayout(seringueLayoutV);                           //Insertion layout Parent -> ZoneCentrale
                        setCentralWidget(zoneCentrale);
                    //--------------Fin de gestion des layouts----------------//
                    }




                    -
                    Edité par AlexandreHARISTOY 13 avril 2018 à 16:16:00

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 avril 2018 à 18:12:19

                      C'est beaucoup trop compliqué (d'ailleurs, j'aurais déjà du le dire plus tôt, rien qu'en voyant le nombre des données membres de fen_programmation)

                      Le SRP est valable aussi pour les IHM!

                      Si j'ai bien analysé les données membre de cette classe, tu veux avoir, dans chaque groupe, un combobox, un LineEdit et un bouton!

                      Hé bien, commence par créer un widget personnalisé (qui pourrait tout à fait dériver de QGroupBox) qui contient ces élément dans l'ordre qui t'intéresse, et fait en sorte qu'il puisse émettre les signaux adéquats (ou, à tout le moins, qu'il soit possible de connecter un slot particulier aux signaux qui t'intéressent dans ce groupe).

                      De cette manière, les données membres de fen_programmation pourraient se résoudre à quelque chose comme

                      MonGroupePerso * groupeAction1;
                      MonGroupePerso * groupeAction2;
                      MonGroupePerso * groupeAction3;
                      MonGroupePerso * groupeAction4;
                      MonGroupePerso * groupeAction5;

                      et son constructeur pourrait se limiter à quelque chose comme

                      groupeAction1 = new MonGroupePerso;
                      groupeAction2 = new MonGroupePerso;
                      groupeAction3 = new MonGroupePerso;
                      groupeAction4 = new MonGroupePerso;
                      groupeAction5 = new MonGroupePerso;
                      /* connecter les slots aux signaux de ces groupes */
                      QVBoxLayout * layout = new QVBoxLayout;
                      layout->addWidget(groupeAction1);
                      layout->addWidget(groupeAction2);
                      layout->addWidget(groupeAction3);
                      layout->addWidget(groupeAction4);
                      layout->addWidget(groupeAction5);
                      setLayout(layout);
                      

                      Et "Basta" ;)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                        13 avril 2018 à 18:26:15

                        C'est vrai tu as tout a fait raison ! Je débute du coup j'améliore mon code au fur et à mesure de mes galères.

                        je vais modifier tout ca.

                        Tu penses que ca va résoudre mon problème initial ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 avril 2018 à 18:53:48

                          Si cela ne le résoud pas, cela te mettra au moins sur la voie pour y arriver ;)

                          Retiens cela: les choses les plus simples sont toujours les moins compliquées.... Heu, pardon, les meilleures.

                          Plus tu donneras de responsabilité à l'une de tes classes ou à l'une de tes fonctions, plus le code deviendra difficile à comprendre et sujet à des bugs "incompréhensibles".

                          A l'inverse, plus le code d'une fonction ou d'une classe sera simple, plus tu auras facile à y trouver d'éventuelles erreurs ;)

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                            17 avril 2018 à 12:26:55

                            Salut salut, j'ai mise à jour mon code mais mon problème persiste... 

                            Mon programme compile toujours parfaitement mais plante au démarrage. Je me suis rendu compte que c'est du à la création de fen_prgrammation (fen_prog = new fenProgrammation) et de l'utilisation de fen_prog.

                            Je vous mets le code mise à jour :

                            Fenprojet.h

                            #ifndef HEADER_FENPROJET
                            #define HEADER_FENPROJET
                            
                            #include <QMenuBar>
                            #include <QToolBar>
                            #include <QMessageBox>
                            #include <QtWidgets>
                            #include <QObject>
                            #include <QMainWindow>
                            #include <QSerialPort>
                            #include <QSerialPortInfo>
                            #include <QDebug>
                            #include <QtMath>
                            #include "seringue.h"
                            #include "slot_voies.h"
                            #include "fen_programmation.h"
                            
                            class QAction;
                            
                            class FenProjet : public QMainWindow
                            {
                                Q_OBJECT
                            
                                public:
                                FenProjet();
                            
                                public slots:
                                void injecter();
                                void aspirer();
                                void new_vitesse();
                                void new_temperature();
                                void calculNombrePas(float volumeADeplacer);
                                void generationTrameMouvement(QString mouvementPasSeringueToFloat);
                                void generationTrameChangementVoie(QString gCodeVoie);
                                void envoie(QString trame);
                                void changementSeringue();
                            
                                private slots:
                                void connexion();
                                void modeProgrammation();
                            
                                signals:
                                void cliqueVoies1();
                            
                                private:
                                void createAction();
                                void createTool();
                            
                                QString vitesseDeplacement = "10";
                            
                                //Variable layout
                                QHBoxLayout *seringueLayout1;
                                QVBoxLayout *layoutGauche1;
                                QVBoxLayout *layoutDroite1;
                                QGroupBox *layoutInformation;
                                QGroupBox *layoutAction;
                            
                                // Initialisation widget
                                QToolBar *toolBarFichier;
                                QAction *actionConnexion;
                                QAction *actionMode_Prog;
                                QLineEdit *volume;
                                QLineEdit *vitesseI;
                                QLineEdit *temperatureI;
                                QLineEdit *valeur_injecter;
                                QPushButton *bouton51;
                                QLineEdit *valeur_aspirer = new QLineEdit;    
                                QPushButton *bouton52;
                                QLineEdit *valeur_vitesseA;
                                QPushButton *bouton53;
                                QLineEdit *valeur_temperatureA;
                                QPushButton *bouton54;
                            
                                QValidator *validator;
                                Slot_voies *slotVoies;
                                Seringue *seringue;
                                Fen_programmation *fen_prog;
                            
                                //Variable Port Serie
                                QSerialPort *arduino;
                                static const quint16 arduino_uno_vendor_id = 1027;
                                static const quint16 arduino_uno_product_id = 24597;
                                QString arduino_port_name;
                                bool arduino_is_available;
                            
                            
                            };
                            
                            #endif

                            Fenprojet.cpp

                            #include "fenprojet.h"
                            #include <QAction>
                            
                            FenProjet::FenProjet()
                            {
                                QWidget *zoneCentrale = new QWidget;
                            
                                QMenu *menuFichier = menuBar()->addMenu("&Fichier");
                                menuFichier->addAction("Test");
                            
                                QMenu *menuEdition = menuBar()->addMenu("&Edition");
                                menuEdition->addAction("Test");
                            
                                createAction();
                                createTool();
                            
                            //-----------Creation Widgets perso-------------//
                            
                                    seringue = new Seringue;
                                    slotVoies = new Slot_voies;
                                    fen_prog = new Fen_programmation;
                            
                             //----------Création des Widgets---------------//
                                validator = new QDoubleValidator(0, 1000, 3, this);
                                validator->setLocale(QLocale::C);   //Ajoute le . dans les nombres à virgule
                            
                                volume = new QLineEdit;
                                volume->setText(QString::number(seringue->volumeMax));
                                QLabel *labVolume = new QLabel(tr("Volume (mL)"));
                                vitesseI = new QLineEdit;
                                vitesseI->setText(vitesseDeplacement);
                                QLabel *labVitesseI = new QLabel(tr("Vitesse (mm/s)"));
                                temperatureI = new QLineEdit;
                                QLabel *labTemperatureI = new QLabel(tr("Température (°C)"));
                                valeur_injecter = new QLineEdit;
                                QLabel *labInjecter = new QLabel(tr("Injecter (mL)"));
                                bouton51 = new QPushButton(tr("Send"));
                                valeur_aspirer = new QLineEdit;
                                QLabel *labAspirer = new QLabel(tr("Aspirer (mL)"));
                                bouton52 = new QPushButton(tr("Send"));
                                valeur_vitesseA = new QLineEdit;
                                QLabel *labVitesseA = new QLabel(tr("Vitesse (mm/s)"));
                                bouton53 = new QPushButton(tr("Send"));
                                valeur_temperatureA = new QLineEdit;
                                QLabel *labTemperatureA = new QLabel(tr("Température (°C)"));
                                bouton54 = new QPushButton(tr("Send"));
                            
                            //-----------Connexion Fonction--------------------//
                            
                                QObject::connect(bouton51, SIGNAL(clicked()), this, SLOT(injecter()));          // relie le clic du bouton send injecter à la fonction injecter
                                QObject::connect(bouton52, SIGNAL(clicked()), this, SLOT(aspirer()));           // relie le clic du bouton send aspirer à la fonction aspirer
                                QObject::connect(bouton53, SIGNAL(clicked()), this, SLOT(new_vitesse()));           // relie le clic du bouton send vitesse à la fonction new_vitesse
                                QObject::connect(bouton54, SIGNAL(clicked()), this, SLOT(new_temperature()));       // relie le clic du bouton send temperature à la fonction new_temperature
                                QObject::connect(slotVoies,SIGNAL(signalVersGeneTram(QString)),this,SLOT(generationTrameChangementVoie(QString)));
                                QObject::connect(seringue, SIGNAL(signalVersVolume()),this,SLOT(changementSeringue()));
                                QObject::connect(fen_prog, SIGNAL(emissionDepuisfen_prog()), this, SLOT(connexion()));
                            
                            //------------Restriction sur les champs de saisi------------//
                                volume->setReadOnly(1);
                                vitesseI->setReadOnly(1);
                                temperatureI->setReadOnly(1);
                            
                                valeur_injecter->setValidator(validator);
                                valeur_aspirer->setValidator(validator);
                                valeur_vitesseA->setValidator(validator);
                                valeur_temperatureA->setValidator(validator);
                            
                            //-----------Gestion des layouts------------------//
                                QVBoxLayout *seringueLayoutV = new QVBoxLayout;     //Création Layout Parent
                                    QHBoxLayout *seringueLayoutH = new QHBoxLayout;     //Création Layout fille 1
                                        layoutDroite1 = new QVBoxLayout;        //Création Layout fille 2 droite (Info et Action)
                                        layoutGauche1 = new QVBoxLayout;        //Création Layout fille 2 gauche (Seringue et trois voies)
                                            layoutInformation = new QGroupBox(tr("Information"));   //Création Layout fille 3 (Info)
                                                QVBoxLayout *layoutVerticalInformation = new QVBoxLayout;   //Création Layout fille 4 Info (label et Line)
                                                layoutVerticalInformation->addWidget(labVolume);
                                                layoutVerticalInformation->addWidget(volume);
                                                layoutVerticalInformation->addWidget(labVitesseI);
                                                layoutVerticalInformation->addWidget(vitesseI);
                                                layoutVerticalInformation->addWidget(labTemperatureI);
                                                layoutVerticalInformation->addWidget(temperatureI);
                                            layoutInformation->setLayout(layoutVerticalInformation);        //Insertion layout fille 4 -> fille 3 (Info)
                            
                                            layoutAction = new QGroupBox(tr("Action"));             //Création Layout fille 3 (Action)
                                                QVBoxLayout *layoutVerticalAction = new QVBoxLayout;        //Création Layout fille 4 Action (Label et layout fille 4)
                                                layoutVerticalAction->addWidget(labInjecter);
                                                    QHBoxLayout *layout4Horizontal1 = new QHBoxLayout;      //Création Layout fille 5-1 (line et boutton)
                                                    layout4Horizontal1->addWidget(valeur_injecter);
                                                    layout4Horizontal1->addWidget(bouton51);
                                                layoutVerticalAction->addLayout(layout4Horizontal1);        //Insertion layout fille 5-1 -> fille 4
                            
                                                layoutVerticalAction->addWidget(labAspirer);
                                                    QHBoxLayout *layout4Horizontal2 = new QHBoxLayout;      //Création Layout fille 5-2 (line et boutton)
                                                    layout4Horizontal2->addWidget(valeur_aspirer);
                                                    layout4Horizontal2->addWidget(bouton52);
                                                layoutVerticalAction->addLayout(layout4Horizontal2);        //Insertion layout fille 5-2 -> fille 4
                            
                                                layoutVerticalAction->addWidget(labVitesseA);
                                                    QHBoxLayout *layout4Horizontal3 = new QHBoxLayout;      //Création Layout fille 5-3 (line et boutton)
                                                    layout4Horizontal3->addWidget(valeur_vitesseA);
                                                    layout4Horizontal3->addWidget(bouton53);
                                                layoutVerticalAction->addLayout(layout4Horizontal3);        //Insertion layout fille 5-3 -> fille 4
                            
                                                layoutVerticalAction->addWidget(labTemperatureA);
                                                    QHBoxLayout *layout4Horizontal4 = new QHBoxLayout;      //Création Layout fille 5-4 (line et boutton)
                                                    layout4Horizontal4->addWidget(valeur_temperatureA);
                                                    layout4Horizontal4->addWidget(bouton54);
                                                layoutVerticalAction->addLayout(layout4Horizontal4);        //Insertion layout fille 5-4 -> fille 4
                            
                                            layoutAction->setLayout(layoutVerticalAction);          //Insertion layout fille 4 -> fille 3 (Action)
                            
                                        layoutDroite1->addWidget(layoutInformation);                //Insertion layout fille 3 (Info) -> fille 2 (Droite)
                                        layoutDroite1->addWidget(layoutAction);                     //Insertion layout fille 3 (Action) -> fille 2 (Droite)
                            
                                        layoutGauche1->addLayout(slotVoies->slot_voiesGrpBox);
                                        layoutGauche1->addWidget(seringue->vue_seringue);           //Insertion layout animation seringue 1 -> fille 2 (Gauche)
                            
                                    seringueLayoutH->addLayout(layoutGauche1);                      //Insertion layout fille 2 (Gauche) -> fille 1
                                    seringueLayoutH->addLayout(layoutDroite1);                      //Insertion layout fille 2 (Droite) -> fille 1
                            
                                seringueLayoutV->addWidget(seringue->typeSeringue);                           //Insertion widget -> Parent
                                seringueLayoutV->addLayout(seringueLayoutH);                        //Insertion layout fille 1 -> Parent
                            
                                zoneCentrale->setLayout(seringueLayoutV);                           //Insertion layout Parent -> ZoneCentrale
                                setCentralWidget(zoneCentrale);
                            //--------------Fin de gestion des layouts----------------//
                            }
                            
                            void FenProjet::injecter()
                            {
                            qDebug() << "Fonction injecter";
                            
                            float quantiteAInjecter = valeur_injecter->text().toFloat();
                            
                            qDebug()<<"quantité à injecter :" << quantiteAInjecter;
                            
                                if(quantiteAInjecter <= seringue->volumeRestant && quantiteAInjecter > 0 /* && arduino_is_available == true */)
                                {
                                    FenProjet::calculNombrePas(quantiteAInjecter*1000); //On multiplie par 100 pour convertir en mm3
                            
                                    seringue->mouvementRectangleLiquide = seringue->pasRectangleLiquide * quantiteAInjecter;        //calcul la quantité total à injecter
                                    seringue->mouvementRectangleOmbreLiquide = seringue->pasRectangleOmbreLiquide * quantiteAInjecter;
                            
                                    for(int x=0; x<seringue->mouvementRectangleLiquide; x=x+1)
                                    {
                                            seringue->tailleRestanteRectangleLiquide = seringue->tailleRestanteRectangleLiquide - 1;
                                            seringue->tailleRestanteRectangleOmbreLiquide = seringue->tailleRestanteRectangleOmbreLiquide - 1;
                            
                                            seringue->liquide->setRect(59,81,83,seringue->tailleRestanteRectangleLiquide);
                                            seringue->ombreLiquide->setRect(72,84,36,seringue->tailleRestanteRectangleOmbreLiquide);
                                    }
                            
                                    seringue->volumeRestant = seringue->volumeRestant - ((quantiteAInjecter/seringue->volumeMax)*seringue->volumeMax);  //Calcul le volume restant dans la seringue
                                    volume->setText(QString::number(seringue->volumeRestant));
                            
                                }
                            
                                else
                                    QMessageBox::warning(this, "Information Seringue", "La quantité saisie est trop importante");
                            }
                            
                            void FenProjet::aspirer()
                            {
                            qDebug() << "Fonction aspirer";
                            float quantiteAAspirer = valeur_aspirer->text().toFloat();
                            
                                if(quantiteAAspirer <= seringue->volumeMax && quantiteAAspirer > 0 /* && arduino_is_available == true */)
                                {
                                    FenProjet::calculNombrePas(quantiteAAspirer*-1000); //On multiplie par -100 pour convertir en mm3 et pour faire fonctionner le moteur vers l'arriere
                            
                                    seringue->mouvementRectangleLiquide = seringue->pasRectangleLiquide * quantiteAAspirer;     //calcul la quantité total à aspirer
                                    seringue->mouvementRectangleOmbreLiquide = seringue->pasRectangleOmbreLiquide * quantiteAAspirer;
                            
                                    for(int x=0; x<seringue->mouvementRectangleLiquide; x=x+1)
                                    {
                                            seringue->tailleRestanteRectangleLiquide = seringue->tailleRestanteRectangleLiquide + 1;
                                            seringue->tailleRestanteRectangleOmbreLiquide = seringue->tailleRestanteRectangleOmbreLiquide + 1;
                            
                                            seringue->liquide->setRect(59,81,83,seringue->tailleRestanteRectangleLiquide);
                                            seringue->ombreLiquide->setRect(72,84,36,seringue->tailleRestanteRectangleOmbreLiquide);
                                    }
                            
                                    seringue->volumeRestant = seringue->volumeRestant + ((quantiteAAspirer/seringue->volumeMax)*seringue->volumeMax);  //Calcul le volume restant dans la seringue
                                    volume->setText(QString::number(seringue->volumeRestant));
                                    valeur_aspirer->clear();                           //Vide la QLine
                                }
                            
                                else
                                    QMessageBox::warning(this, "Information Seringue", "La quantité saisie est trop importante");
                            
                            }
                            
                            void FenProjet::calculNombrePas(float volumeADeplacer)
                            {
                                int mouvementPasSeringue;
                                QString mouvementPasSeringueToString;
                            
                                mouvementPasSeringue = ( (volumeADeplacer/seringue->surfaceSeringue) / seringue->pasPousseSeringue );
                            
                                mouvementPasSeringueToString = QString::number(mouvementPasSeringue);
                            
                                qDebug()<< "Calcul nombre de pas (String) : " << mouvementPasSeringueToString;
                            
                                FenProjet::generationTrameMouvement(mouvementPasSeringueToString);
                            }
                            
                            void FenProjet::changementSeringue()
                            {
                                volume->setText(QString::number(seringue->volumeMax));
                            }
                            
                            void FenProjet::new_vitesse()
                            {
                            qDebug() << "Fonction new vitesse";
                            QString chaineCaracVitesse = valeur_vitesseA->text();
                            
                               vitesseDeplacement = chaineCaracVitesse;
                               vitesseI->clear();
                               vitesseI->setText(vitesseDeplacement);
                            }
                            
                            void FenProjet::new_temperature()
                            {
                                qDebug() << "Fonction new temp";
                            
                                QString recupValeurNewTemperature = valeur_temperatureA->text();
                            
                                qDebug() << recupValeurNewTemperature;
                            
                                valeur_temperatureA->clear();
                            }
                            
                            void FenProjet::connexion()
                            {
                                arduino_is_available = false;
                                arduino_port_name = "";
                                arduino = new QSerialPort;
                            
                                foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
                                {
                                        if(serialPortInfo.hasVendorIdentifier() && serialPortInfo.hasProductIdentifier())
                                        {
                                            if(serialPortInfo.vendorIdentifier() == arduino_uno_vendor_id)
                                            {
                                                if(serialPortInfo.productIdentifier() == arduino_uno_product_id)
                                                {
                                                    arduino_port_name = serialPortInfo.portName();
                                                    arduino_is_available = true;
                                                }
                                            }
                                        }
                                    }
                            
                                if(arduino_is_available)
                                {
                                       // open and configure the serialport
                                       arduino->setPortName(arduino_port_name);
                                       arduino->open(QSerialPort::ReadWrite);
                                       arduino->setBaudRate(QSerialPort::Baud115200);
                                       arduino->setDataBits(QSerialPort::Data8);
                                       arduino->setParity(QSerialPort::NoParity);
                                       arduino->setStopBits(QSerialPort::OneStop);
                                       arduino->setFlowControl(QSerialPort::NoFlowControl);
                                       QMessageBox::information(this,"info port","connexion done");
                                       QMessageBox::information(this, "Info Port", "Connection with Arduino is done");
                                 }
                                else
                                {
                                       // give error message if not available
                                       QMessageBox::warning(this, "Port error", "Couldn't find the Arduino!");
                                 }
                            }
                            
                            void FenProjet::generationTrameMouvement(QString mouvementPasSeringueToFloat)
                            {
                                QString trame = "G00 X" + mouvementPasSeringueToFloat + " F" + vitesseDeplacement;
                                qDebug() << trame;
                            
                                FenProjet::envoie(trame);
                            }
                            
                            void FenProjet::generationTrameChangementVoie(QString gCodeVoie)
                            {
                                QString trame = gCodeVoie;
                                qDebug() << trame;
                            
                                FenProjet::envoie(trame);
                            }
                            
                            void FenProjet::envoie(QString trame)
                            {
                                    QByteArray byte; //byte a envoyer
                                    qint64 bw = 0; //bytes really writen
                            
                                    byte.clear(); // on efface le contenu de byte
                                    byte.append(trame); // on ajoute "value" a byte
                                    byte.append("\n"); // On ajoute le retour a la lgine
                            
                                    if(arduino != NULL && arduino->isWritable() ){ // on vérifie que le port existe toujours
                                        bw = arduino->write(byte); // on écrit les byte
                                        //(bw récupere le nombre de byte écris)
                                        qDebug() << bw << "byte(s) written | Value sent:" << trame ;
                                        arduino->flush(); // on attend la fin de la transmission
                                    }
                            
                            }
                            
                            void FenProjet::createAction()
                            {
                                actionConnexion = new QAction(tr("&Connexion"), this);
                                connect(actionConnexion, SIGNAL(triggered()), this, SLOT(connexion()));
                            
                                actionMode_Prog = new QAction(tr("&Programmation"),this);
                                connect(actionMode_Prog, SIGNAL(triggered()), this, SLOT(modeProgrammation()));
                            }
                            void FenProjet::modeProgrammation()
                            {
                                fen_prog->show();
                            }
                            
                            void FenProjet::createTool()
                            {
                                toolBarFichier = addToolBar("Connexion");
                                toolBarFichier->addAction(actionConnexion);
                                toolBarFichier->addAction(actionMode_Prog);
                            }

                            fen_programmation.h

                            #ifndef FEN_PROGRAMMATION_H
                            #define FEN_PROGRAMMATION_H
                            
                            #include <QtWidgets>
                            #include <QObject>
                            #include <QDialog>
                            #include <QDebug>
                            #include <QFile>
                            #include <QTextStream>
                            #include "action_box.h"
                            #include "seringue.h"
                            
                            class Fen_programmation : public QDialog
                            {
                                Q_OBJECT
                            
                                public:
                            
                                    Fen_programmation();
                            
                                    QHBoxLayout *repetition();
                                    QHBoxLayout *boutons();
                                    QPushButton *ouvrir;
                                    QPushButton *enregistrer;
                                    QPushButton *lancer;
                                    QLineEdit *nombreRepetiton;
                            
                                    Action_box *actionBox1;
                                    Action_box *actionBox2;
                                    Action_box *actionBox3;
                                    Action_box *actionBox4;
                                    Action_box *actionBox5;
                            
                                    QValidator *validator;
                            
                                    Seringue *seringue;
                            
                                    QString sequence1;
                                    QString sequence2;
                                    QString sequence3;
                                    QString sequence4;
                                    QString sequence5;
                            
                            
                                public slots :
                                    void bouton_ValiderAction1();
                                    void bouton_ValiderAction2();
                                    void bouton_ValiderAction3();
                                    void bouton_ValiderAction4();
                            
                                    void ecriture_sequences();
                                    void generation_sequence();
                                    void lancer_sequences();
                            
                                    QString calculNombrePas(float volumeADeplacer);
                            
                            signals:
                                void emissionDepuisfen_prog();
                            };
                            
                            #endif // FEN_PROGRAMMATION_H

                            fan_programmation.cpp

                            #include "fen_programmation.h"
                            
                            Fen_programmation::Fen_programmation()
                            {
                                validator = new QDoubleValidator(0, 1000, 3, this);
                                validator->setLocale(QLocale::C);
                            
                                seringue = new Seringue;
                                actionBox1 = new Action_box;
                                actionBox2 = new Action_box;
                                actionBox3 = new Action_box;
                                actionBox4 = new Action_box;
                                actionBox5 = new Action_box;
                            
                                QVBoxLayout *layoutVerticalPrincipal = new QVBoxLayout;
                            
                                layoutVerticalPrincipal->addWidget(seringue->typeSeringue);
                                layoutVerticalPrincipal->addWidget(actionBox1);
                                layoutVerticalPrincipal->addWidget(actionBox2);
                                layoutVerticalPrincipal->addWidget(actionBox3);
                                layoutVerticalPrincipal->addWidget(actionBox4);
                                layoutVerticalPrincipal->addWidget(actionBox5);
                                layoutVerticalPrincipal->addLayout(repetition());
                                layoutVerticalPrincipal->addLayout(boutons());
                            
                                //Set du layout grille
                                setLayout(layoutVerticalPrincipal);
                            
                                //Ajout de l'entete de fenetre
                                setWindowTitle("Mode Programmation");
                            
                                //connection
                                QWidget::connect(actionBox1->validerAction,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction1()));
                                QWidget::connect(actionBox2->validerAction,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction2()));
                                QWidget::connect(actionBox3->validerAction,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction3()));
                                QWidget::connect(actionBox4->validerAction,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction4()));
                            
                                QWidget::connect(enregistrer,SIGNAL(clicked(bool)),this,SLOT(generation_sequence()));
                                QWidget::connect(lancer,SIGNAL(clicked(bool)),this,SLOT(lancer_sequences()));
                            }
                            
                            QHBoxLayout *Fen_programmation::repetition()
                            {
                                QIntValidator *repetitionValidator = new QIntValidator(0,100,this);
                                QHBoxLayout *repetitonHBox = new QHBoxLayout;
                                QLabel *repetionLabel = new QLabel;
                                nombreRepetiton = new QLineEdit;
                                nombreRepetiton->setValidator(repetitionValidator);
                            
                                repetionLabel->setText("Nombre de répétition : ");
                            
                                repetitonHBox->addWidget(repetionLabel);
                                repetitonHBox->addWidget(nombreRepetiton);
                            
                                return repetitonHBox;
                            }
                            
                            QHBoxLayout *Fen_programmation::boutons()
                            {
                                QHBoxLayout *boutonHBox = new QHBoxLayout;
                            
                                ouvrir = new QPushButton(tr("Ouvrir"));
                                enregistrer = new QPushButton(tr("Enregistrer"));
                                lancer = new QPushButton(tr("Lancer"));
                            
                                boutonHBox -> addWidget(ouvrir);
                                boutonHBox -> addWidget(enregistrer);
                                boutonHBox -> addWidget(lancer);
                            
                                return boutonHBox;
                            }
                            void Fen_programmation::bouton_ValiderAction1()
                            {
                                actionBox2->actionGrpBox->show();
                            }
                            
                            void Fen_programmation::bouton_ValiderAction2()
                            {
                                actionBox3->actionGrpBox->show();
                            }
                            
                            void Fen_programmation::bouton_ValiderAction3()
                            {
                                actionBox4->actionGrpBox->show();
                            }
                            
                            void Fen_programmation::bouton_ValiderAction4()
                            {
                                actionBox5->actionGrpBox->show();
                            }
                            
                            QString Fen_programmation::calculNombrePas(float volumeADeplacer)
                            {
                                int mouvementPasSeringue;
                                QString mouvementPasSeringueToString;
                            
                                mouvementPasSeringue = ( (volumeADeplacer/seringue->surfaceSeringue) / seringue->pasPousseSeringue );
                            
                                mouvementPasSeringueToString = QString::number(mouvementPasSeringue);
                            
                                qDebug()<< "Calcul nombre de pas (String) : " << mouvementPasSeringueToString;
                            
                                return mouvementPasSeringueToString;
                            }
                            
                            void Fen_programmation::generation_sequence()
                            {
                                float quantiteADeplacer;
                            
                                if(actionBox1->actionGrpBox->isFlat() == 1)  //Si groupe boxe est validé (n'a plus le fond gris)
                                {
                                    sequence1 = actionBox1->slotVoiesAction->nomVoie + "\n";  //GCode de la voie de sortie
                            
                                    sequence1 = sequence1 + "G00 ";
                                    if(actionBox1->choixAction->currentText() == "Aspirer")
                                    {
                                        sequence1 = sequence1 + "X-";
                                    }
                                    if(actionBox1->choixAction->currentText() == "Injecter")
                                    {
                                        sequence1 = sequence1 + "X";
                                    }
                                    quantiteADeplacer = actionBox1->mouvAction->text().toFloat();
                                    sequence1 = sequence1 + Fen_programmation::calculNombrePas(quantiteADeplacer*1000);
                                    sequence1 = sequence1 + " F" + actionBox1->vitesseAction->text();
                            
                                    qDebug() << sequence1;
                            
                                    if(actionBox2->actionGrpBox->isFlat() == 1)
                                    {
                                        sequence2 = actionBox2->slotVoiesAction->nomVoie + "\n";  //GCode de la voie de sortie
                            
                                        sequence2 = sequence2 + "G00 ";
                                        if(actionBox2->choixAction->currentText() == "Aspirer")
                                        {
                                            sequence2 = sequence2 + "X-";
                                        }
                                        if(actionBox2->choixAction->currentText() == "Injecter")
                                        {
                                            sequence2 = sequence2 + "X";
                                        }
                                        quantiteADeplacer = actionBox2->mouvAction->text().toFloat();
                                        sequence2 = sequence2 + Fen_programmation::calculNombrePas(quantiteADeplacer*1000);
                                        sequence2 = sequence2 + " F" + actionBox2->vitesseAction->text();
                            
                                        qDebug() << sequence2;
                            
                                        if(actionBox3->actionGrpBox->isFlat() == 1)
                                        {
                                            sequence3 = actionBox3->slotVoiesAction->nomVoie + "\n";  //GCode de la voie de sortie
                            
                                            sequence3 = sequence3 + "G00 ";
                                            if(actionBox3->choixAction->currentText() == "Aspirer")
                                            {
                                                sequence3 = sequence3 + "X-";
                                            }
                                            if(actionBox3->choixAction->currentText() == "Injecter")
                                            {
                                                sequence3 = sequence3 + "X";
                                            }
                                            quantiteADeplacer = actionBox3->mouvAction->text().toFloat();
                                            sequence3 = sequence3 + Fen_programmation::calculNombrePas(quantiteADeplacer*1000);
                                            sequence3 = sequence3 + " F" + actionBox3->vitesseAction->text();
                            
                                            qDebug() << sequence3;
                            
                                            if(actionBox4->actionGrpBox->isFlat() == 1)
                                            {
                                                sequence4 = actionBox4->slotVoiesAction->nomVoie + "\n";  //GCode de la voie de sortie
                            
                                                sequence4 = sequence4 + "G00 ";
                                                if(actionBox4->choixAction->currentText() == "Aspirer")
                                                {
                                                    sequence4 = sequence4 + "X-";
                                                }
                                                if(actionBox4->choixAction->currentText() == "Injecter")
                                                {
                                                    sequence4 = sequence4 + "X";
                                                }
                                                quantiteADeplacer = actionBox4->mouvAction->text().toFloat();
                                                sequence4 = sequence4 + Fen_programmation::calculNombrePas(quantiteADeplacer*1000);
                                                sequence4 = sequence4 + " F" + actionBox4->vitesseAction->text();
                            
                                                qDebug() << sequence4;
                            
                                                if(actionBox5->actionGrpBox->isFlat() == 1)
                                                {
                                                    sequence5 = actionBox5->slotVoiesAction->nomVoie + "\n";  //GCode de la voie de sortie
                            
                                                    sequence5 = sequence5 + "G00 ";
                                                    if(actionBox5->choixAction->currentText() == "Aspirer")
                                                    {
                                                        sequence5 = sequence5 + "X-";
                                                    }
                                                    if(actionBox5->choixAction->currentText() == "Injecter")
                                                    {
                                                        sequence5 = sequence5 + "X";
                                                    }
                                                    quantiteADeplacer = actionBox5->mouvAction->text().toFloat();
                                                    sequence5 = sequence5 + Fen_programmation::calculNombrePas(quantiteADeplacer*1000);
                                                    sequence5 = sequence5 + " F" + actionBox5->vitesseAction->text();
                            
                                                    qDebug() << sequence5;
                                                }
                                            }
                                        }
                                    }
                                }
                            
                                Fen_programmation::ecriture_sequences();
                            }
                            
                            void Fen_programmation::ecriture_sequences()
                            {
                                QString nom_fichier;
                            
                                while((nom_fichier = QInputDialog::getText(NULL,"Fichier","Quel est le nom du fichier ?")).isEmpty())
                                    QMessageBox::critical(NULL,"Erreur","Aucun nom de fichier n'a été spécifié !");
                            
                                QFile fichier("nom_fichier");
                            
                                fichier.setFileName("/Users/alexandreharistoy/Documents/Qtapp/Pousse_Seringue_GUI/Sauvegarde/"+ nom_fichier +".txt");
                            
                                if (!fichier.open(QIODevice::WriteOnly | QIODevice::Text))
                                    return;
                            
                                QTextStream flux(&fichier);
                                //flux.setCodec("UTF-8");
                            
                                if(actionBox1->actionGrpBox->isFlat() == 1)  //Si groupe boxe est validé (n'a plus le fond gris)
                                {
                                    flux << sequence1 << endl;
                            
                                    if(actionBox2->actionGrpBox->isFlat() == 1)
                                    {
                                        flux << sequence2 << endl;
                            
                                        if(actionBox3->actionGrpBox->isFlat() == 1)
                                        {
                                            flux << sequence3 << endl;
                            
                                            if(actionBox4->actionGrpBox->isFlat() == 1)
                                            {
                                                flux << sequence4 << endl;
                            
                                                if(actionBox5->actionGrpBox->isFlat() == 1)
                                                {
                                                    flux << sequence5 << endl;
                                                }
                                            }
                                        }
                                    }
                                }
                            
                                flux << nombreRepetiton->text() << endl;
                            
                                fichier.close();
                                QMessageBox::information(NULL,"Fichier Enregistrer","Fichier Enregistrer");
                            }
                            
                            void Fen_programmation::lancer_sequences()
                            {
                                if(actionBox1->actionGrpBox->isFlat() == 1)  //Si groupe boxe est validé (n'a plus le fond gris)
                                {
                                    emit emissionDepuisfen_prog();
                            
                                    if(actionBox2->actionGrpBox->isFlat() == 1)
                                    {
                            
                            
                                        if(actionBox3->actionGrpBox->isFlat() == 1)
                                        {
                            
                                            if(actionBox4->actionGrpBox->isFlat() == 1)
                                            {
                            
                            
                                                if(actionBox5->actionGrpBox->isFlat() == 1)
                                                {
                            
                                                }
                                            }
                                        }
                                    }
                                }
                            
                            }

                            action_box.h

                            #ifndef ACTION_BOX_H
                            #define ACTION_BOX_H
                            
                            #include <QGroupBox>
                            #include <QtWidgets>
                            #include <QObject>
                            #include "slot_voies.h"
                            
                            class Action_box : public QGroupBox
                            {
                                Q_OBJECT
                            
                            public:
                                Action_box();
                            
                                QGroupBox *actionGrpBox;
                                QComboBox *choixAction;
                                QLineEdit *mouvAction;
                                QLineEdit *vitesseAction;
                                QPushButton *validerAction;
                                Slot_voies *slotVoiesAction;
                                QValidator *validator;
                            
                            public slots:
                                void etatBouton_ValiderAction();
                                void bouton_ValiderAction();
                            
                            };
                            
                            #endif // ACTION_BOX_H
                            

                            action_box.cpp

                            #include "action_box.h"
                            
                            Action_box::Action_box()
                            {
                                actionGrpBox = new QGroupBox(tr("Action1"));
                            
                                //Creation des elements du groupe box
                                choixAction = new QComboBox;
                                choixAction -> addItem(tr("Injecter"));
                                choixAction -> addItem(tr("Aspirer"));
                                mouvAction = new QLineEdit;
                                mouvAction -> setPlaceholderText(tr("Quantité"));
                                vitesseAction = new QLineEdit;
                                vitesseAction -> setPlaceholderText(tr("Vitesse"));
                                validerAction = new QPushButton(tr("Ok"));
                                validerAction->setEnabled(0);
                                slotVoiesAction = new Slot_voies;
                            
                                //Creation de l'organisation du GroupeBox
                                QHBoxLayout *horizontalLayout = new QHBoxLayout;
                                horizontalLayout->addWidget(choixAction);
                                horizontalLayout->addWidget(mouvAction);
                                horizontalLayout->addWidget(vitesseAction);
                                horizontalLayout->addLayout(slotVoiesAction->slot_voiesGrpBox);
                                horizontalLayout->addWidget(validerAction);
                            
                                //restriction
                                mouvAction->setValidator(validator);
                                vitesseAction->setValidator(validator);
                            
                                actionGrpBox -> setLayout(horizontalLayout);
                            
                                actionGrpBox -> show();
                            
                                QWidget::connect(validerAction,SIGNAL(clicked(bool)),this,SLOT(bouton_ValiderAction()));
                            
                                QWidget::connect(mouvAction,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction()));
                                QWidget::connect(vitesseAction,SIGNAL(textEdited(QString)),this,SLOT(etatBouton_ValiderAction()));
                                QWidget::connect(slotVoiesAction->voie1RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction()));
                                QWidget::connect(slotVoiesAction->voie2RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction()));
                                QWidget::connect(slotVoiesAction->voie3RadioBouton,SIGNAL(clicked(bool)),this,SLOT(etatBouton_ValiderAction()));
                            }
                            
                            void Action_box::bouton_ValiderAction()
                            {
                                choixAction->setEnabled(0);
                                mouvAction->setReadOnly(1);
                                vitesseAction->setReadOnly(1);
                                actionGrpBox->setFlat(1);
                            }
                            
                            void Action_box::etatBouton_ValiderAction()
                            {
                                if(!mouvAction->text().isEmpty() && !vitesseAction->text().isEmpty() && ( slotVoiesAction->voie1RadioBouton->isChecked() || slotVoiesAction->voie2RadioBouton->isChecked() || slotVoiesAction->voie3RadioBouton->isChecked() ))
                                {
                                    validerAction->setEnabled(1);
                                }
                                else
                                validerAction->setEnabled(0);
                            }








                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 avril 2018 à 16:53:06

                              Bonjour,

                              Je crois que tu devrais séparer les donnes de l’application, de la vue. Il sera plus claire et plus simple de chercher les erreurs. Dans une démarche plus MVC.

                              Dans ton code, j'ai l'impression que plusieurs fonctions de fen_projet, auraient pu être dans une nouvelle classe que fournirait les donnes à interface. 

                              les variables de seringue sont publiques? Dans ce exemple elles sont accessibles directement:

                              seringue->mouvementRectangleLiquide = seringue->pasRectangleLiquide * quantiteAAspirer; 

                              -
                              Edité par Tringola 18 avril 2018 à 17:00:38

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Dis-toi bien que si quelque chose devait me manquer, ce ne serait plus le vin, ce serait l'ivresse !Jean Gabin, Un Singe en Hiver

                              Probleme de header Qt

                              × 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