Partage
  • Partager sur Facebook
  • Partager sur Twitter

framework Qt /C++

liaison d'une interface graphique avec fichier csv

    21 novembre 2017 à 21:45:31

    Bonsoir,
    Mon projet consiste à créer une interface graphique avec le framework [Qt],dont le but est d'organiser la gestion d'une cafétéria.
    du coup j'ai élabore un fichier csv qui contient tous les types de produits (Café,eau,Tisane,Coca) et leur prix .
    ensuit j'ai écrit le programme avec le language C++,qui permet de lire ce fichier csv ,puis j'ai crée un widget qui constitue (Nom produit,Prix achat ,stock restant).

    Svp,Maintenant je cherche la fonction qui va appeler le prix et le stock , par exemple lorsque je sélectionne dans l'interface le type de produit que je veux ,le prix et le stock restant s'affichent automatiquement . 

    Merci d'avance

    -
    Edité par Fayyza 21 novembre 2017 à 21:47:11

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2017 à 8:23:37

      Salut,

      Ben c'est très bien x)

      Quel est le soucis ?

      • Partager sur Facebook
      • Partager sur Twitter
      Dream on, Dream on, Dream until your dream comes true
        22 novembre 2017 à 8:32:17

        Bonjour,

        lorsque tu dis "lire" le fichier csv, dans quel type de variable stockes tu les informations (nom, prix, stock) ?

        peux tu donner le code de ta classe?

        Voici un exemple qui doit repondre plus ou moins a ta problematique.

        On supporse que dans l'interface graphique tu as:

        un QComboBox nomme comboBoxNom

        un QLabel nomme labelPrix

        un QLabel nomme labelQte

        Voici le .h

        #ifndef WIDGET_H
        #define WIDGET_H
        
        #include <QWidget>
        #include <QStringList>
        
        namespace Ui {
        class Widget;
        }
        
        class Widget : public QWidget
        {
            Q_OBJECT
        
        public:
            explicit Widget(QWidget *parent = 0);
            ~Widget();
        
        private slots:
            void slotComboBox_currentIndexChanged(int index);
        
        private:
            Ui::Widget *ui;
            QStringList nom;
            QStringList prix;
            QStringList qte;
        };
        
        #endif // WIDGET_H



        Voici le .cpp

        #include "widget.h"
        #include "ui_widget.h"
        
        Widget::Widget(QWidget *parent) :
            QWidget(parent),
            ui(new Ui::Widget)
        {
            ui->setupUi(this);
            prix.append("2");
            prix.append("4");
            qte.append("35");
            qte.append("67");
            nom.append("Choisissez un produit");
            nom.append("nom1");
            nom.append("nom2");
            ui->comboBoxNom->addItems(nom);
            connect(ui->comboBoxNom,SIGNAL(currentIndexChanged(int)),this,SLOT(slotComboBox_currentIndexChanged(int)));
        
        }
        
        Widget::~Widget()
        {
            delete ui;
        }
        
        void Widget::slotComboBox_currentIndexChanged(int index)
        {
            if (index>0){
                ui->labelPrix->setText(prix.at(index-1));
                ui->labelQte->setText(qte.at(index-1));
            }
        
        
        
        }
        



        -
        Edité par bxdfr 22 novembre 2017 à 8:45:12

        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2017 à 9:06:44

          C'est étrange de représenter un prix et une quantité par un string, c'est pour pouvoir écrire "5 euros 17" ?

          Je pencherais plutôt pour représenter le prix à l'aide de double et les quantités à l'aide d'entiers, et effectuer le formattage à l'affichage

          Aussi je pense que l'associativité que tu as faite à l'aide des index n'est pas très propre, elle n'assure aucune unicité, les tableaux peuvent ne pas être de la même taille tu n'as donc aucune garantie sur l'association, d'ailleurs t'as dû feinter afin d'insérer la chaine "choississez un produit".

          Je conseillerais donc plus une solution à base de map, qui utilise une désignation comme clé (ici le nom du produit) et lui associe en valeur une structure ou un tuple (je penche pour la structure, c'est plus clair et plus souple) comprenant le prix et les quantités

          Et je conseille également d'utiliser la syntaxe Qt5 du connect

          -
          Edité par romantik 22 novembre 2017 à 9:09:28

          • Partager sur Facebook
          • Partager sur Twitter
          Dream on, Dream on, Dream until your dream comes true
            22 novembre 2017 à 9:23:41

            @romantik

            Etant donné qu'apparement, la personne ne souhaite faire que de l'affichage, et que son fichier csv semble comporter pour chaque ligne : nom, prix, qte, ça ne doit pas être génant.

            Ensuite je suis d'accord avec toi sur le map et tout ça, mais la personne ne semble pas très familiere avec QT, donc j'ai proposé au plus simple, pas au plus beau, ni au plus modulable, ni au plus "propre".

            Enfin, je n'aime pas la nouvelle syntaxe pour le connect. je suis un vieux croulant, je n'aime pas changer mes habitudes. :)

            • Partager sur Facebook
            • Partager sur Twitter
              22 novembre 2017 à 9:25:09

              Salut,

              De manière générale, tu va devoir créer une interface graphique qui corresponde à tes besoins.

              Tu peux la faire à l'aide de QtDesigner, dont tu dispose normalement, en te basant sur l'un des exemples que tu trouveras ici

              Ou tu peux la créer "a mano", en te basant sur cet exemple-ci.

              Le choix t'appartient ;)

              Mais tu dois commencer par réfléchir à la forme que tu veux que cette interface prenne:  Veux tu avoir un bouton pour chaque article que tu va vendre, et l'affichage du ticket de caisse à coté (avec, bien sur, le total du ticket de caisse)? ou veux tu choisir les articles dans une liste déroulante / dans un combobox? sont des questions auxquelles il faudra répondre!

              Une fois que l'interface sera créée viendra le plus dur: déterminer quelle réaction doit être entreprise dans quelle circonstances.  Et là, tu vas commencer à jouer avec des choses sympa comme les signaux, les slots ou des classes comme QAction ;)

              On peut t'aider, à peu près à toutes les étapes.  Mais le gros du travail devra malgré tout venir de toi ;)

              • 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
                22 novembre 2017 à 9:33:55

                Bonjour ,

                Merci d'abord pour vos  réponses , en fait comme a dit bxdfr , je suis débutante je n'ai jamais travaillé avc Qt , voici mon .cpp .....même si mes slots ne fonctionne pas ,j'ai just eu l'interface avec des produits séléctionnés , par contre les prix et les stocks non plus , et je cherche comment faire pour les apparaitre à chaque fois j sélectionne un produit.Merci

                #include"mainwindow.h"
                #include<QBoxLayout>
                #include<QSpinBox>
                #include<QApplication>
                #include<QFrame>
                #include<QFormLayout>
                #include<QComboBox>
                #include<QFile>
                #include<QString>
                #include<QPushButton>
                #include<QTextLine>
                #include<QLabel>
                MainWindow::MainWindow(QWidget*parent):QMainWindow(parent)
                {
                QFrame*frame=newQFrame(this);
                setCentralWidget(frame);
                QBoxLayout*lay=newQBoxLayout(QBoxLayout::TopToBottom,frame);
                QLabel*label=newQLabel("Produit",this);
                QLabel*label1=newQLabel("Prixd'achat",this);
                QLabel*label2=newQLabel("Prixdevente",this);
                QLabel*label3=newQLabel("Stock",this);
                QComboBox*C1=newQComboBox;
                QDoubleSpinBox*S1=newQDoubleSpinBox;
                QDoubleSpinBox*S2=newQDoubleSpinBox;
                QDoubleSpinBox*S3=newQDoubleSpinBox;
                C1->addItem("");
                C1->addItem("Café");
                C1->addItem("Coca");
                C1->addItem("Chocolat");
                C1->addItem("Eau");
                C1->addItem("eau");
                C1->addItem("Icetea");
                C1->addItem("Oasis");
                C1->addItem("Tisane");
                lay->addWidget(label);
                lay->addWidget(C1);
                lay->addWidget(label1);
                lay->addWidget(S1);
                lay->addWidget(label2);
                lay->addWidget(S2);
                lay->addWidget(label3);
                lay->addWidget(S3);
                lay->addStretch();
                QHBoxLayout*lay1=newQHBoxLayout(this);
                QPushButton*save=newQPushButton("Sauver");
                lay1->addWidget(save);
                QPushButton*b1=newQPushButton("Quitter");
                connect(b1,SIGNAL(clicked()),this,SLOT(quit()));
                lay1->addWidget(b1);
                lay->addLayout(lay1);
                MainWindow::~MainWindow()
                {}
                voidMainWindow::slotbouton()
                {
                qApp->quit();
                }

                -
                Edité par Fayyza 22 novembre 2017 à 9:43:15

                • Partager sur Facebook
                • Partager sur Twitter
                  22 novembre 2017 à 10:03:06

                  Il faut rentrer le code à l'aide du bouton [</>] pour avoir la bonne mise en forme

                  Ton slot ne marche pas car MainWindow n'a aucune fonction quit() (erreur impossible avec la nouvelle syntaxe :D), soit tu te connecte à ton slotbouton, soit tu pourrais directement de connecter à qApp

                  connect(b1, &QPushButton::clicked, this, &MainWindow::slotbouton);

                  ou

                  connect(b1, &QPushButton::clicked, qApp, &QCoreApplication::quit);

                  Et prend l'habitude de donner des parents à tes objets

                  Et de mon point de vue, ton soucis est toujours l'associativité, tu ajoute des noms dans ta ComboBox mais ils ne sont associé nulle part aux prix et quantité, donc difficle de faire le lien.

                  Si je reste sur le code de bxdfr (pour ne pas m'embêter avec ton erreur de format dans le post, et éviter de m'encombrer avec l'UI), et que j'ajoute la map, ça donnerait quelque chose du genre (non testé) :

                  #ifndef WIDGET_H
                  #define WIDGET_H
                   
                  #include <QWidget>
                  #include <map>
                  #include <string>
                   
                  namespace Ui {
                  class Widget;
                  }
                   
                  class Widget : public QWidget
                  {
                      Q_OBJECT
                   
                  public:
                      explicit Widget(QWidget *parent = 0);
                      ~Widget();
                   
                  private slots:
                      void afficherCaracteristiques(QString text);
                   
                  private:
                      struct CaracProduit
                      {
                          double prix;
                          unsigned int qte;
                  
                          CaracProduit(double price = 0, unsigned int quantite = 0) : prix{price}, qte{quantite} {}
                      }
                      Ui::Widget *ui;
                      std::map<std::string, CaracProduit> m_produits;
                  };
                   
                  #endif // WIDGET_H
                  #include "widget.h"
                  #include "ui_widget.h"
                  
                  #include <utility>
                   
                  Widget::Widget(QWidget *parent) :
                      QWidget(parent),
                      ui(new Ui::Widget)
                  {
                      ui->setupUi(this);
                      m_produits.insert(std::make_pair("nom1", CaracProduit(2, 35)));
                      m_produits.insert(std::make_pair("nom2", CaracProduit(4, 67)));
                  
                      ui->comboBoxNom->addItem("Choisissez un produit");
                      for(const auto & produit : m_produits)
                          ui->comboBoxNom->addItem(produit.first);
                      connect(ui->comboBoxNom,&QComboBox::currentTextChanged,this,&Widget::afficherCaracteristiques));
                   
                  }
                   
                  Widget::~Widget()
                  {
                      delete ui;
                  }
                   
                  void Widget::afficherCaracteristiques(QString text)
                  {
                      try{
                          const CaracProduit & caracs = m_produits.at(text.toStdString());
                          ui->labelPrix->setText(QString::number(caracs.prix));
                          ui->labelQte->setText(QString::number(caracs.qte));
                      }catch(const std::out_of_range & e){
                          ui->labelPrix->setText(""));
                          ui->labelQte->setText(""));
                      }
                  }

                  C'est trop compliqué ?

                  -
                  Edité par romantik 22 novembre 2017 à 11:01:41

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Dream on, Dream on, Dream until your dream comes true
                    22 novembre 2017 à 10:44:44

                    Merci Romantik , bon voici le modèle de mon interface , donc je cherche lorsque je sélectionne le produit coca par exemple ses prix s'affichent .

                    je cherche une fonction qui va just appeler les prix et stock de la liste déroulante du fichier !

                    je beugue aussi sur le slot de sauver ,je ne le sais pas vraiment.

                    Merci de votre retour

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 novembre 2017 à 11:14:47

                      FatimazahraSalouh a écrit:

                      je cherche une fonction qui va just appeler les prix et stock de la liste déroulante du fichier !

                      Il n'y a pas de "liste déroulante du fichier", il y a un fichier qui contient des données, et ton application qui détient une liste déroulante construite à l'aide de ces données extraites du fichier. C'est au moment de cette extraction des données que tu vas les ranger de façon associatives pour pouvoir les retrouver plus tard (peut importe le moyen, j'ai proposé la map mais les multiples listes à index communs sont aussi une façon, et il y en a d'autres ...). Puisque tu va lire le fichier, reconnaitre le format, extraire l'information et la stocker dans tes variables.

                      Attention quand tu fais appel à des ressources externes comme ça, tu dois faire des vérifications, est-ce que le format correspond bien à ce que tu attendais ? est-ce que les valeurs sont valables/corrects ? est-ce que tu as accès à cette ressource ?

                      FatimazahraSalouh a écrit:

                      je beugue aussi sur le slot de sauver ,je ne le sais pas vraiment.

                      Ben nous non plus, ça pourrait tout aussi bien être mémoriser les caractéristiques en mémoire pour pouvoir naviguer entre les produits (ce qui implique que le changement n'est pas mémoriser sur le changement de valeur de la SpinBox), que réécrire le fichier csv. C'est à toi de définir le comportement que tu souhaite et ensuite tu as plusieurs façons de l'implémenter (signal/slot étant sûrement la plus simple, mais pas la seule)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Dream on, Dream on, Dream until your dream comes true
                        22 novembre 2017 à 11:23:17

                        Oui Romantik vous avez raison ,c'est un fichier csv qui contient toutes les données (type produits,prix ,stock) , enfait j'ai pu écrire le programme qui lit le fichier et ça marche bien de ce coté (vous le trouverez ci dessous ) !le souci est just l'associativité ,et je serai reconnaissante de votre réactivité .merci  

                        #include <QString>
                        #include <QVector>
                        #include <iostream>
                        #include <fstream>
                        #include <sstream>
                        #include <QCoreApplication>
                        
                        using namespace std ;
                        
                        
                        class Produit
                        {
                        private:
                            QString nom_ ;
                          double pvente_, pachat_ ; // unités non gérées
                          int stock_ ;
                          QString ustock_ ;
                        public:
                          Produit( const QString& nom="", double pvente=0, double pachat=0, int stock=-9999 , const QString& ustock="piece") ;
                          friend ostream& operator<<(ostream& , const Produit& ) ;
                          friend istream& operator>>(istream& ,  Produit& ) ;
                          int stock() { return stock_ ; }
                          double pvente() { return pvente_ ; }
                          double pachat() { return pachat_ ; }
                          bool isValid() { return stock_ != -9999 ; }
                          void clear() { nom_.clear(); pvente_ = pachat_ = 0 ; stock_ = -9999 ;}
                        };
                        
                        Produit::Produit( const QString& nom, double pvente, double pachat, int stock , const QString& ustock)
                          : nom_(nom), pvente_(pvente), pachat_(pachat), stock_(stock), ustock_(ustock)
                        {
                        }
                        
                        ostream& operator<<(ostream& os, const Produit& p)
                        {
                          os << p.nom_.toStdString() << ", " << p.pvente_ << ",euro, "
                             << p.pachat_ << ",euro, " << p.stock_ << "," << p.ustock_.toStdString() << flush ;
                          return os ;
                        }
                        
                        bool skipC( istream &is)
                        {
                          while( is.peek() == ' ') is.get() ;
                          if( is && is.peek() == ',' ) { is.get() ;  return true ; }
                          return false ;
                        }
                        
                        bool getW( istream &is, string& r)
                        {
                          int c ;
                          r.clear() ;
                          is >> ws ;
                          while( (c=is.peek()),  !is.eof() && c  != ','  &&  c != ' '  &&  c != '\n' )
                            r += is.get() ;
                          return !r.empty() ;
                        }
                        
                        istream& operator>>(istream& is,  Produit& p)
                        {
                          string n, u ;
                          double pachat, pvente , stock ;
                          p.clear();
                          if( getW(is,n)
                              && skipC(is) && (is >> pvente) && skipC(is) && getW(is,u)
                              && skipC(is) && (is >> pachat) && skipC(is)  &&  getW(is,u)
                              && skipC(is) && (is >> stock) && skipC(is)  && getW(is,u)
                              )
                          {
                            p.nom_ = n.c_str() ; p.pvente_ = pvente ; p.pachat_ = pachat ; p.stock_ = stock ; p.ustock_ = u.c_str() ;
                          }
                          return is ;
                        }
                        
                        bool isComment( const string& s)
                        {
                          if( s.empty()) return true ;
                        
                          for(size_t k = 0 ; k < s.size() ; ++k)
                          {
                            if( s[k] == ' ') continue ;
                            else if( s[k] == '#') return true ;
                            else return false ;
                          }
                          return true ; // que des blancs
                        }
                        
                        QVector<Produit> lireProduits( const QString& filename)
                        {
                          QVector<Produit> r ;
                          Produit p ;
                          istringstream iline ;
                        
                          ifstream f(filename.toStdString()) ;
                          if(!f.is_open()) throw "Erreur d'ouverture du fichier" ;
                        
                          string line ;
                          // Lire les commentaires avant le magic number
                          do
                          {
                            getline(f,line) ;
                          } while ( isComment(line) ) ;
                        
                          if( line != "produits")  // test intolérant aux blancs de tete
                            throw "Mauvais magic number" ;
                        
                          while( getline(f,line) )
                          {
                            if( isComment(line) ) continue ;
                            iline.clear() ; iline.str(line) ;
                            if( iline >> p ) r.push_back(p);
                            else break ;
                          }
                        
                        
                          return r ;
                        }
                        
                        void ecrireProduits( QVector<Produit>& p, const QString& filename)
                        {
                            ofstream f( filename.toStdString().c_str()) ;
                            if( f.is_open() )
                            {
                                f << "produits" << endl ;
                                f << "#nom, pachat, unité, pvente, unité, stock, unité" << endl ;
                                for(int i = 0 ; i < p.size() ; ++i)
                                    f << p[i] << endl ;
                            }
                            else throw "Erreur ouverture fichier de sortie" ;
                        }
                        
                        int main(int argc, char *argv[])
                        {
                          QCoreApplication a(argc, argv);
                        
                          try
                          {
                            auto produits = lireProduits("Produits.csv") ;
                        
                            cout << "il y a " << produits.size() << " produits " << endl ;
                        
                            for(const auto& p : produits )
                              cout << p << endl ;
                        
                            ecrireProduits(produits,"Produits2.csv");
                        
                          }
                          catch(const char *e)
                          {
                            cout << "Ooops ! " << e << endl ;
                          }
                        
                          return 0 ;
                        }
                        

                        -
                        Edité par Fayyza 22 novembre 2017 à 11:24:23

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 novembre 2017 à 11:46:27

                          Ah bah ok, tu l'as déjà ton association, puisque tu as modéliser chaque produit sous forme de classe qui possède ses propres caractéristiques.

                          Tout ce qu'il faut, c'est que MainWindow détienne (ou au moins connaisse) le QVector de retour de la lecture, et sur le slot connecté à la ComboBox, tu fait une recherche dans cette liste pour trouver le produit dont le champs "nom" correspond à la chaine contenue dans la ComboBox.

                          Attention l'une des limites de ta méthode est que tu pourrais avoir inséré plusieurs fois le même nom de produit (et donc en fonction de comment tu vas faire la recherche, tu vas par exemple toujours tomber sur la première occurence)

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Dream on, Dream on, Dream until your dream comes true
                            22 novembre 2017 à 12:37:07

                            oui , alors comment puis je faire ou ajouter , pour que puisse sélectionner un produit automatiquement avoir son prix et son stock , c'est le seul souci qui m'intrigue et qui me confronte pour finaliser ma widget . merci d'avance

                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 novembre 2017 à 14:20:24

                              Encore une fois je ne vais pas m'ennuyer avec l'UI puisque ça allourdirais l'exemple, mais ça va ressembler à quelque chose comme ça, après à voir si tu as besoin d'optimiser la recherche et tout dépend l'architecture que tu souhaite, mais pour faire simple :

                              class MainWindow : public QMainWindow
                              {
                                  Q_OBJECT
                              public:
                                  explicit MainWindow(QWidget* parent = 0);
                                  ~MainWindow();
                              
                              public slots:
                                  void afficherCaracteristiques(const QString & produit);
                              
                              private:
                                  Ui::MainWindow* ui;
                                  QVector<Produit> m_produits;
                              }
                              
                              MainWindow::MainWindow(QWidget* parent):
                                  QMainWindow(parent),
                                  ui(new Ui::MainWindow),
                                  m_produits()
                              {
                                  ui->setupUi(this);
                              
                                  m_produits = lireProduits(QFileDialog::getOpenFileName(this, "Open File", ".", ".csv"));
                              
                                 for(const auto & produit : m_produits)
                                     ui->comboBox_produit->addItem(produit.nom());
                                 connect(ui->comboBox_produit, &QComboBox::currentTextChanged, this, &MainWindow::afficherCaracteristiques);
                              }
                              
                              MainWindow::~MainWindow()
                              {
                                  delete ui;
                              }
                              
                              void MainWindow::afficherCaracteristiques(const QString & produit)
                              {
                                  auto it = m_produits.begin();
                                  while(it!=m_produits.end() && it->nom()!=produit) ++it;
                                  if(it!=m_produits.end())
                                  {
                                      ui->spinBox_prixAchat->setValue(it->pachat());
                                      ui->spinBox_prixVente->setValue(it->pvente());
                                      if(it->isValid())
                                      {
                                          ui->spinBox_stocks->setEnabled(true);
                                          ui->spinBox_stocks->setValue(it->stock());
                                      }
                                      else
                                          ui->spinBox_stocks->setEnabled(false);
                                  }
                              }



                              • Partager sur Facebook
                              • Partager sur Twitter
                              Dream on, Dream on, Dream until your dream comes true
                                22 novembre 2017 à 14:49:59

                                merci je pense que ca va aller avec ce programme , just j'ai pas su l’appellation de  it et ui , parce que je n'ai jamais les utilisés ça réfère quoi dans le programme.BIG MERCI
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  22 novembre 2017 à 15:09:19

                                  it c'est juste le nom que j'ai donné à mon itérateur pour parcourir le QVector

                                  Et ui c'est juste une classe qui va gérer l'interface, c'est à dire qu'il contient tout les widgets de l'interface (la comboBox, les SpinBox, les layers, les boutons ...) et configure leurs propriétés (hauteur, largeur, visible, enable etc...). C'est une classe qui peut-être généré automatiquement par QtDesigner, c'est la différence qu'à évoqué koala, ça rend le code plus lisible car ça sépare mise en page et comportement.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Dream on, Dream on, Dream until your dream comes true
                                    22 novembre 2017 à 16:56:36

                                    Oui , Merci beaucoup pour vos effort...bon j'ai présenté le travail au superviseur ,et du coup il a critiqué un point que je ne le vois pas tellement un problème,il m'a dit que je dois pas intégrer les Item moi même il n'a même pas aimé les voir il faut que le programme qui fait appeler du fichier ,donc toute cette partie ci dessous sera supprimé ,et beh je dois écrit un tout petit code dans le mainwindow.cpp  ...,et franchement moi j'ai pas su comment vu que c’était facile pour moi de mettre les Items :(
                                    C1->addItem("Café");
                                    C1->addItem("Coca");
                                    C1->addItem("Chocolat");
                                    C1->addItem("Eau");
                                    C1->addItem("eau");
                                    voici le résultat de compilation du programme qui lit le fichier.csv, si ça sera utile à écrire le programme qu'il a demandé 
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      22 novembre 2017 à 17:20:06

                                      Ma foi, je ne peux que être d'accord avec lui, l'interface doit se construire en fonction des données extraites, ce ne sera pas toujours Café Coca Chocolat et Eau

                                      Tu as tout ce qu'il te faut dans les posts précédents, je ne vois pas ce que tu ne saisis pas

                                      Est-ce que tu es en mesure de comprendre chaque ligne des codes qui ont été posté ici ? (y compris celui que tu as posté, tu l'as écrit ou c'est ton superviseur, ou des morceaux pris sur internet ?)

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Dream on, Dream on, Dream until your dream comes true
                                        22 novembre 2017 à 18:41:28

                                        Bon, cela devrait vouloir dire que tu as, quelque  part, une structure qui devrait ressembler à quelque chose comme
                                        struct Produit{
                                            std::string designation;
                                            double prixDeVente; /* ou une structure "monnaye", peut etre? */
                                            double prixDachat; /* idem */
                                            size_t quantite;
                                            std::string unite;
                                        };

                                        Sinon, il faudra que tu commences par créer cette structure ;).  De toutes manières, tu en auras pour pouvoir garder les données que tu extrais de ton fichier cvs en mémoire, donc... Tu sais ce qu'il te reste à faire :D

                                        La deuxième étape consistera à remplir une collection (un std::vector ou une std::map dont la clé serait une chaine de caractères, correspondant à la donnée designation) qui puisse contenir tous tes produits lorsque tu les lis depuis le fichier cvs.

                                        La troisième étape consistera -- pourquoi pas, à vrai dire -- à créer un "widget personnalisé" qui puisse représenter les informations contenues dans cette structure.

                                        Tu as plusieurs possibilités: soit tu utilise le designer, soit tu code une classe dérivant de QWidget, carrément à la main.  Le choix t'appartient ;)

                                        L'étape suivante consistera à créer un modèle qui sera rempli à l'aide des informations extraite du fichier cvs (donc, pour faire simple, à l'aide des informations que tu retrouve dans la collection de Produit) et de fournir ce modèle à une vue qui pourra afficher un widget par produit (voire, qui sera en mesure d'afficher les widgets de tous les produits ;) )

                                        Ensuite, il faudra faire en sorte que le modèle puisse modifier le stock (au niveau, donc, de l collection de "Produit") à chaque fois qu'un article est vendu.

                                        L'idéal étant de faire en sorte qu'un "ticket de caisse" soit généré pour chaque client.  Un ticket de caisse nétant en définitive qu'un élément reprenant les différents produits vendus à un client donné, en indiquant à chaque fois bien sur le nombre d'exemplaires de cet aricle que le client a pris ;)

                                        Et enfin, la dernière étape sera de trouver le moyen d'enregistrer chaque ticket de caisse plus ou moins séparément et de sauvegarder l'état du stock lorsque le programme est fermé.

                                        Maintenant, l'utilisation d'un ticket de caisse n'est pas vraiment la solution qui me semble le mieux adaptée.  L'utilisation d'une base de données me semblerait effectivement bien préférable pour ce genre d'utilisation ;)

                                        • 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
                                          23 novembre 2017 à 12:57:40

                                          Bonjour , je m'excuse pour ce retard imprévu ,bon pour répondre au poste de Romantik , j'ai compris ce que vous avez posté et pour le code que j'ai posté ,c'est lui qui l'a écrit...moi j'ai fait la widget beh il m'a dit c'est bien mais tu devras pas mettre les Item comme ça bête non il fallait écrire un code pour les appeler depuis ton tableau .et beh c'est ça le truc ! ce code sera ecrire dans Mainwindow.cpp de la widget

                                          Pour répondre aussi à Koala1 le superviseur ne voulait pas travailler avec Qdesigner , il voulait un code comme vous avez dit , donc moi je beugue à cette etape pour avancer , je sais que je débute dans ce domaine mais je fonce à lire bcp de documents et à bien comprendre vos postes qui sont vrm utiles et intéressants , Merci bcp bcp

                                          -
                                          Edité par Fayyza 23 novembre 2017 à 13:11:11

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            23 novembre 2017 à 14:35:49

                                            FatimazahraSalouh a écrit:

                                            pour le code que j'ai posté ,c'est lui qui l'a écrit


                                            Ok, je pensais que c'était toi, donc ça montrais quand même un certain niveau que je t'avais attribué. Donc il y a des choses que je tenais pour acquis, et donc je suis passé rapidement dessus dans mes posts précédents, sans explications, car je prenais ça pour acquis.

                                            Du coup, il n'y a aucune honte à poser des questions sur ce que j'ai utilisé comme base (par exemple les itérateurs)

                                            FatimazahraSalouh a écrit:

                                            il fallait écrire un code pour les appeler depuis ton tableau .et beh c'est ça le truc !

                                            Les éléments de réponse sont dans les postes précédents, fait des efforts pour comprendre et poser les bonnes questions, celles auxquelles on pourra répondre.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Dream on, Dream on, Dream until your dream comes true
                                              23 novembre 2017 à 14:43:38

                                              ouiii merci .........ne vous inquiété pas ,votre code est plus facile que le sien du coup j'ai presque compris ..mais lorsque j'ai présente le code il m'a dit que c'est bete d'ajouter les items comme ça dans le mainwindow de widget , non il fallait écrire un code et remplir un tableau , ce que je n'ai pas compris moi et d'ailleurs ca sera just une fonction ou même deux ligne pour lier le resultat du code qui lit le fichier csv au code de widget, pare qu'il a  validé le reste de votre code Romantik

                                              C1->addItem("Coca");
                                              C1->addItem("Chocolat");
                                              C1->addItem("Eau");
                                              C1->addItem("eau");

                                              -
                                              Edité par Fayyza 23 novembre 2017 à 15:14:27

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 novembre 2017 à 15:17:29

                                                FatimazahraSalouh a écrit:

                                                lier le resultat du code qui lit le fichier csv au code de widget

                                                Et c'est quelque chose que je fais dans mon dernier code mais que tu n'as pas compris là non plus, c'est pour ça que j'insiste sur les questions, tu n'as vraisemblablement pas le niveau de suivre se qui s'est dit, donc pose des questions !

                                                En plus tu as la chance : koala s'est intéressé au sujet, il est capable de tenir des discours très pédagogique, rien de mieux pour éclaircir les zones d'ombres.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Dream on, Dream on, Dream until your dream comes true
                                                  23 novembre 2017 à 15:47:56

                                                  Oui Romantik t'as raison et je suis reconnaissante pour vos retour Merci bcp , j'ai pas compris ce code est ce que tu peux m'expliquer avec plus de détaille svp: 

                                                  m_produits = lireProduits(QFileDialog::getOpenFileName(this, "Open File", ".", ".csv"));
                                                   
                                                     for(const auto & produit : m_produits)
                                                         ui->comboBox_produit->addItem(produit.nom());
                                                     connect(ui->comboBox_produit, &QComboBox::currentTextChanged, this, &MainWindow::afficherCaracteristiques);
                                                  auto it = m_produits.begin();
                                                      while(it!=m_produits.end() && it->nom()!=produit) ++it;
                                                      if(it!=m_produits.end())

                                                  -
                                                  Edité par Fayyza 23 novembre 2017 à 15:55:48

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 novembre 2017 à 16:13:24

                                                    m_produits = lireProduits(QFileDialog::getOpenFileName(this, "Open File", ".", ".csv"));

                                                    ouvre une fenêtre demandant à l'utilisateur de choisir un fichier ayant l'extension .csv et récupère son nom

                                                    puis passe le nom de ce fichier à la fonction lireProduits qui extrait les données du csv et les renvoie dans un QVector que je stocke dans m_produits

                                                    d'ailleurs belle erreur ici, l'utilisateur peut fermer la fenetre de dialogue ou cliquer sur annuler et ce cas n'est pas géré ici, il faut rectifier ça.

                                                    for(const auto & produit : m_produits)
                                                           ui->comboBox_produit->addItem(produit.nom());

                                                     pour chaque produit contenu dans la collection m_produits, je récupère le nom et l'insère dans la comboBox

                                                     connect(ui->comboBox_produit, &QComboBox::currentTextChanged, this, &MainWindow::afficherCaracteristiques);

                                                    Utilise le mécanisme signal/slot de Qt. Lorsque le texte de la comboBox a changé (choix d'un autre item), fait appel à la fonction afficherCaracteristiques

                                                    auto it = m_produits.begin();

                                                     récupère l'itérateur indiquant le premier élément de la liste

                                                     while(it!=m_produits.end() && it->nom()!=produit) ++it;

                                                     Parcours la liste à l'aide de l'itérateur jusqu'à trouver un produit dont le nom correspond à la combobox ou jusqu'arriver à la fin

                                                     if(it!=m_produits.end())

                                                    Si (après parcours) on n'est pas arrivé à la fin, cela sous-entend que l'on a trouver un produit dont le nom correspond

                                                    Il s'agit là d'un algorithme de recherche simple à comprendre, mais ce n'est pas le plus performant car si ton élément est à la fin tu vas parcourir tout les éléments de ta liste avant. Il existe des algorithmes de recherche plus performant, notamment si tu tries ton tableau. Ce pourrais être pas mal ensuite d'essayer des optimisations, car si ton application est destinée à lire des csv représentant un liste de produit, il y a de bonnes chance qu'il y en ait des centaines, ou des milliers

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Dream on, Dream on, Dream until your dream comes true
                                                      23 novembre 2017 à 17:02:42

                                                      ouiiiiiiiii j'ai compris , just m_produits que je ne sais pas bien est ce que c'est une classe ?

                                                      QVector<produits>m_produits;



                                                      -
                                                      Edité par Fayyza 23 novembre 2017 à 17:05:23

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        23 novembre 2017 à 17:49:06

                                                        Oui, il s'agit d'une classe de Qt, le QVector. Le rôle de cette classe est de gérer un ensemble d'instance d'un même type, c'est ce qu'on appelle une collection (ou on parle de conteneur, car on parle de containers en anglais). Il existe plusieurs types de collection, chacun approprié à un cas d'utilisation. La propriété notable du vector est qu'il occupe un espace continue en mémoire, ce qui rend les parcours de la collection rapide mais l'insertion lente.

                                                        Cette classe sert donc a contenir un ensemble d'objet du même type, mais quel type au fait ? eh bien c'est ce qui est préciser entre les chevrons, c'est ce qu'on appelle un template. Les templates permettent de creer des classes génériques, qui sont valables pour plusieurs types. Il s'agit là de quelque chose d'assez compliqué à expliquer, je t'invite donc à lire un cours si tu souhaites approfondir. On précise ici qu'il s'agit d'un QVector s'appliquant à des Produit, c'est donc des objets de type Produit qui seront présent dans la collection.

                                                        Et enfin Produit est la classe que tu as défini dans ton code

                                                        class Produit
                                                        {
                                                        private:
                                                            QString nom_ ;
                                                          double pvente_, pachat_ ; // unités non gérées
                                                          int stock_ ;
                                                          QString ustock_ ;
                                                        public:
                                                          Produit( const QString& nom="", double pvente=0, double pachat=0, int stock=-9999 , const QString& ustock="piece") ;
                                                          friend ostream& operator<<(ostream& , const Produit& ) ;
                                                          friend istream& operator>>(istream& ,  Produit& ) ;
                                                          int stock() { return stock_ ; }
                                                          double pvente() { return pvente_ ; }
                                                          double pachat() { return pachat_ ; }
                                                          bool isValid() { return stock_ != -9999 ; }
                                                          void clear() { nom_.clear(); pvente_ = pachat_ = 0 ; stock_ = -9999 ;}
                                                        };



                                                        -
                                                        Edité par romantik 24 novembre 2017 à 10:29:12

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Dream on, Dream on, Dream until your dream comes true
                                                          24 novembre 2017 à 10:54:27

                                                          merci romantik , maintenant j'ai une idée bien claire sur le code , bon je vous montrerez ce dernier si il y ' des gaffes pour les corriger apart void afficher les caractéristiques de produit , il m'a dit non ne la mettre pas !

                                                          tout en sachant que j'ai du doute , ou je mettre ce code est ce que dans le main.cpp ou un complément au code de la widget genre dans mainwindow.cpp.....BIG MERCI!

                                                          #include "mainwindow.h"
                                                          #include<QBoxLayout>
                                                          #include<QSpinBox>
                                                          #include<QApplication>
                                                          #include<QFrame>
                                                          #include<QFormLayout>
                                                          #include<QComboBox>
                                                          #include<QFile>
                                                          #include<QString>
                                                          #include<QPushButton>
                                                          #include<QTextLine>
                                                          #include<QLabel>
                                                          
                                                          MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
                                                          {
                                                              QFrame *frame =new QFrame(this);
                                                              setCentralWidget(frame);
                                                              QBoxLayout*lay=new QBoxLayout(QBoxLayout::TopToBottom,frame);
                                                              QLabel *label = new QLabel("Produit  ",this);
                                                              QLabel *label1 = new QLabel("Prix d'achat ",this);
                                                              QLabel *label2 = new QLabel("Prix de vente ",this);
                                                              QLabel *label3 = new QLabel("Stock ",this);
                                                              QComboBox*C1=new QComboBox;
                                                              QDoubleSpinBox*S1=new QDoubleSpinBox;
                                                              QDoubleSpinBox*S2=new QDoubleSpinBox;
                                                              QDoubleSpinBox*S3=new QDoubleSpinBox;
                                                              lay->addWidget(label);
                                                              lay->addWidget(C1);
                                                              lay->addWidget(label1);
                                                              lay->addWidget(S1);
                                                              lay->addWidget(label2);
                                                              lay->addWidget(S2);
                                                              lay->addWidget(label3);
                                                              lay->addWidget(S3);
                                                              lay->addStretch();
                                                              QHBoxLayout*lay1=new QHBoxLayout(this);
                                                              QPushButton*b1=new QPushButton("Sauver");
                                                              lay1->addWidget(b1);
                                                              QPushButton*b2=new QPushButton("Quitter");
                                                              connect(b1, &QPushButton::clicked, this, &MainWindow::slotbouton);
                                                              lay1->addWidget(b2);
                                                              lay->addLayout(lay1);
                                                          }
                                                          MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
                                                          {
                                                               //ouvrir un fichier ayant l'extension Produits.csv
                                                               m_Produit = lireProduits(QFileDialog::getOpenFileName(this,"Open File", "Produits",".csv"));
                                                               for(const auto & Produit :m_Produit) //chaque produit contenu dans m_produits,je récupère le nom et l'insère dans la comboBox
                                                               comboBox_Produit->addItem(Produit.nom());
                                                               auto it = m_Produit.begin();          //recupere l'iterateur indiquant le premier élément de la liste
                                                               while(it!=m_Produit.end() && it->nom()!=Produit) ++it; //Parcourir la liste
                                                               if(it!=m_Produit.end())
                                                           {
                                                                spinBox_prixAchat->setValue(it->pachat());
                                                                spinBox_prixVente->setValue(it->pvente());
                                                                if(it->isValid())
                                                                 {
                                                                 spinBox_stocks->setEnabled(true);
                                                                 spinBox_stocks->setValue(it->stock());
                                                          }
                                                                     else
                                                                 spinBox_stocks->setEnabled(false);
                                                          }
                                                          
                                                          }
                                                          
                                                          {
                                                           qApp->quit();
                                                          }



                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            29 novembre 2017 à 15:50:22

                                                            salut romantik ,

                                                            merci de ton soutien et tes efforts , j'ai pu faire un code mais mon encdr ne l'a pas accepté puisque il a pensé d'une manière à ce que je dois écrire un code qui contient une combobox .cette derniere doit appeller les produits de meme ordre que le fichier csv et a chaque fois je selectionne lproduit , le spinbobox de prix d'achat donne le prix correcte du produit .

                                                            je cherche les fonctions qui peuvent être utiles et répondre à cette problématique, et je suis la pour toute proposition .

                                                            merci d'avance 

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              29 novembre 2017 à 16:26:13

                                                              Et que font les codes que l'on a évoqué selon toi ?

                                                              Le soucis c'est que ton code n'est pas juste, le compilateur doit t'indiquer plein d'erreur que tu dois résoudre avant même de poster ici

                                                              Ensuite ton algorithme de recherche doit bien être dans une fonction séparée (celle que j'avais appelé afficherCaractéristiques) car elle va être appelée à chaque fois que la combobox va changer d'indice. Je ne connais pas les raisons qui ont poussé ton tuteur à te faire supprimer cette fonction, mais soit il ne veut pas surcharger la classe avec des fonctions membres (si elle est privée je vois pas le problème), et tu as la solution des fonctions lambda, soit il ne veut pas voir de connect et il va alors falloir que tu te débrouille avec les évènements (mais je vois pas l'intérêt de se passer du signal/slot)

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Dream on, Dream on, Dream until your dream comes true

                                                              framework Qt /C++

                                                              × 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