Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer le contenu d'une fenetre avec Qt

Sujet résolu
    27 juillet 2020 à 1:26:29

    Bonjour,

    Après avoir lu les sujets du même titre je suis toujours bloquée, je me permet donc de reposer cette question.

    J'ai codé une fenetre en Qt dont voici le code:

    fichier MaFenetre.h:

    #ifndef DEF_MAFENETRE
    #define DEF_MAFENETRE
    
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QLabel>
    #include <QStackedWidget>
    #include <QMainWindow>
    
    class MaFenetre : public QMainWindow
    {
        Q_OBJECT
    
        public:
        MaFenetre();
        ~MaFenetre();
    
        private:
        QPushButton *m_bouton;
        QPushButton *m_bouton2;
        QLabel *label;
    };
    
    #endif
    



    fichier MaFenetre.cpp

    #include "MaFenetre.h"
    #include <QWidget>
    #include <QLabel>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include <QMainWindow>
    #include <QComboBox>
    
    MaFenetre::MaFenetre() : QMainWindow()
    {
        setFixedSize(600, 300);
    
        label = new QLabel("Bonjour",this);
    
    
        m_bouton2 = new QPushButton("Continuer", this);
        m_bouton2->setFont(QFont("Comic Sans MS", 14));
        m_bouton2->setCursor(Qt::PointingHandCursor);
    
        // Construction du bouton
        m_bouton = new QPushButton("Quitter", this);
    
        m_bouton->setFont(QFont("Comic Sans MS", 14));
        m_bouton->setCursor(Qt::PointingHandCursor);
    
        QObject::connect(m_bouton, SIGNAL(clicked()), qApp, SLOT(quit()));
    
        QVBoxLayout *LAYOUT = new QVBoxLayout;
        QHBoxLayout *layout = new QHBoxLayout;
    
        LAYOUT->addWidget(label);
        LAYOUT->addLayout(layout);
    
        layout->addWidget(m_bouton2);
        layout->addWidget(m_bouton);
    
        this->setLayout(LAYOUT);
    
    
    
    
    
    }
    


    Je souhaite qu'en appuyant sur le bouton "continuer" cela me redirige sur une autre page sans ouvrir une nouvelle fenêtre.

    • J'ai vu qu'il fallait utiliser QStackedWidget et j'ai essayé de suivre l'exemple https://openclassrooms.com/forum/sujet/qt-changer-le-contenu-d-une-fenetre , sauf que je ne comprend pas tout ce que font les lignes de codes et je ne parviens pas à l'adapter à mon cas. Et comme je débute tout juste je ne met sans doute pas ce qu'il faut dans les fichiers header ou sources des fenêtres secondaires.
    • J'ai également lu la doc sur QStackedWidget ( https://doc.qt.io/qt-5/qstackedwidget.html#details ) et une fois encore je ne suis pas certaine de ce que font les lignes de codes, ni où je dois les mettre et donc encore moins comment les adapter.
    • En lisant plusieurs autres réponses j'ai fini par m'embrouiller et je ne sais donc pas s'il faut coder deux pages indépendantes et les lier par la suite (ce qui me semble le plus intuitif) ou coder la seconde page directement dans le code de la première et changer l'affichage (ce qui me parait beaucoup plus complexe et obscure).

    La première fenêtre est simplement une fenêtre d’accueil et je ne souhaite pas particulièrement pouvoir y retourner, donc je ne sais pas non plus si cette méthode est la plus simple ou non.

    Au final j'ai donc plusieurs questions:

    1.QStackedWidget est-il vraiment la meilleur option?

    si oui:

    2. De combien de fichiers ai-je besoin si je souhaite faire UN changement de contenu ? Quels sont-ils ?

    3. Que font les lignes de code présentée dans la doc et comment peut-on les adapter?

    Merci beaucoup!

    -
    Edité par HélèneRousseau1 27 juillet 2020 à 1:28:40

    • Partager sur Facebook
    • Partager sur Twitter
      29 juillet 2020 à 15:05:26

      Bonjour , tu codes tous à la main?

      Tu utilises quel outil pour développer avec Qt ?

      QStackedWidget semble répondre à ce que tu souhaites faire.

      Je ne suis pas certain de comprendre ce que tu entends par "combien de fichiers" ? Un QStackedWidget est un widget comme un autre, donc il est créé dans ta fenetre principale et il contient des "pages", chaque page contenant ce que tu veux.

      les pages sont indexée, la première commence à 0.

      Pour se placer sur une page on utilise la méthode setCurrentIndex.

      Exemple d'un staked avec 2 pages, un label sur chaque page et on se place sur la 2nd page du stacked

      QStackedWidget *stackedWidget;
      QWidget *page;
      QLabel *label;
      QWidget *page_2;
      QLabel *label_2;
      
      stackedWidget = new QStackedWidget(this);
      // creation de la 1ere page
      page = new QWidget();
      //creation et ajout d'un label dans la premier page
      label = new QLabel("label page 1",page);
      // ajout de la page dans le stacked widget
      stackedWidget->addWidget(page);
      
      // creation de la 2nd page
      page_2 = new QWidget();
      //creation et ajout d'un label dans la 2nd page
      label_2 = new QLabel("label page 1",page_2);
      // ajout de la page dans le stacked widget
      stackedWidget->addWidget(page_2);
      
      // on se place sur la 2nd page (donc index 1)
      stackedWidget->setCurrentIndex(1);
      



      • Partager sur Facebook
      • Partager sur Twitter
        6 août 2020 à 19:29:18

        Bonjour,

        Merci beaucoup pour votre réponse. J'ai utilisé votre code en essayant de l'adapter à mon cas et lorsque je fais tourner le code j'ai une erreur me disant qu'il n'y a pas le slot que j'ai créer... Je remet le nouveau code. 

        Mon ficher .cpp

        #include "MaFenetre.h"
        #include <QHBoxLayout>
        #include <QVBoxLayout>
        
        
        
        MaFenetre::MaFenetre() : QWidget()
        {
            setFixedSize(600, 300);
        
            stackedWidget = new QStackedWidget(this);
            pageprincipale = new QWidget();
            stackedWidget->addWidget(pageprincipale);
        
            label = new QLabel("Bienvenu", pageprincipale);
        
            m_bouton = new QPushButton("Continuer", pageprincipale);
            m_bouton->setFont(QFont("Comic Sans MS", 14));
            m_bouton->setCursor(Qt::PointingHandCursor);
        
            m_bouton2 = new QPushButton("Quitter", pageprincipale);
            m_bouton2->setFont(QFont("Comic Sans MS", 14));
            m_bouton2->setCursor(Qt::PointingHandCursor);
        
            QHBoxLayout *layout = new QHBoxLayout;
            layout -> addWidget(m_bouton);
            layout -> addWidget(m_bouton2);
        
            QVBoxLayout *LAYOUT = new QVBoxLayout;
            LAYOUT -> addWidget(label);
            LAYOUT -> addLayout(layout);
        
            pageprincipale->setLayout(LAYOUT);
        
            page1 = new QWidget();
            labelpage1 = new QLabel("test",page1);
            stackedWidget->addWidget(page1);
        
            stackedWidget->setCurrentIndex((0));
        
        
            QObject::connect(m_bouton2, SIGNAL(clicked()), qApp, SLOT(quit()));
            QObject::connect(m_bouton , SIGNAL(clicked()), this, SLOT(changerpage(1)));
        
        
        
        }
        
        
        void MaFenetre::changerpage(int index){
        
            stackedWidget->setCurrentIndex((index));
        }
        
        
        
        

        et mon fichier header

        #ifndef DEF_MAFENETRE
        #define DEF_MAFENETRE
        
        #include <QApplication>
        #include <QWidget>
        #include <QPushButton>
        #include <QLabel>
        #include <QStackedWidget>
        
        class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
        {
            Q_OBJECT
        
            public:
            MaFenetre();
        
            public slots:
            void changerpage(int index);
        
            private:
            QStackedWidget *stackedWidget;
            QWidget *pageprincipale;
            QLabel *label;
            QPushButton *m_bouton;
            QPushButton *m_bouton2;
            QWidget *page1;
            QLabel *labelpage1;
        };
        
        #endif
        

        Avec ce code j'obtiens l'erreur : QObject::connect: No such slot MaFenetre::changerpage(1)


        et si je remplace

        QObject::connect(m_bouton , SIGNAL(clicked()), this, SLOT(changerpage(1)));

        par

        QObject::connect(m_bouton , SIGNAL(clicked()), qApp, SLOT(changerpage(1)));

        j'obtiens l'erreur : QObject::connect: No such slot QApplication::changerpage(1)



        Quelqu'un saurait-il d'où cette erreur provient?

        Merci beaucoup


        • Partager sur Facebook
        • Partager sur Twitter
          6 août 2020 à 21:13:20

          non, tu ne peux pas donner la valeur du parametre de ton slot lors de l'association.

          fais plutot comme ça:

              QObject::connect(m_bouton , &QPushButton::clicked, this, &MaFenetre::changerpage);
           
           
           
          }
           
           
          void MaFenetre::changerpage(){
           
              stackedWidget->setCurrentIndex(1);
          }

          Du coup dans le .h

           
          class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
          {
              Q_OBJECT
           
              public:
              MaFenetre();
           
              public slots:
              void changerpage();

          Ou une autre solution qui utilise une lambda:

             QObject::connect(m_bouton , &QPushButton::clicked, this,[=](){stackedWidget->setCurrentIndex(1);});
           
          
          }

          et du coup tu n'as plus besoin du slot changerpage (ni dans le .h , ni dans le .cpp)



          • Partager sur Facebook
          • Partager sur Twitter
            6 août 2020 à 23:18:52

            Ça fonctionne!

            Merci infiniment!

            • Partager sur Facebook
            • Partager sur Twitter

            Changer le contenu d'une fenetre avec 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