Partage
  • Partager sur Facebook
  • Partager sur Twitter

QT / QLayout: Attempting to add QLayout "" to QMai

Sujet résolu
    15 juillet 2019 à 21:54:50

    Bonjour,

    j'ai tenté de suivre le cours https://www.youtube.com/watch?v=050zzD4c-5c ici, car j'ai pas trouvé de truc plus simple à lire immédiatement (si vous avez un meilleur lien je suis preneur)

    Bon, sinon à 37 min environ, il dit de faire un certain code, j'ai tenté de faire le même mais le compilo me dit : "QLayout: Attempting to add QLayout "" to QMainWindow "", which already has a layout"

    Et sinon y'a un QPushButton qui pop comme ça, je sais pas d'ou il vient... (et c'est pas un de mes CustomButton, sur lequels y'a écrit toto dessus)


    si vous trouvez le problème (surement une erreur de copie ou de version qq part je pense)


    mon code :

    main.cpp :

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    

    mainWindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include "custombutton.h"
    #include <QVBoxLayout>
    #include <QWidget>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        //Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
    
        QList<CustomButton *> m_listCustomBtn;
        QVBoxLayout* m_vLayout;
        QWidget* m_mainWidget;
    };
    
    #endif // MAINWINDOW_H
    

    mainWindow.cpp :

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    {
        setWindowTitle("Ceci est une super Application !");
    
        m_mainWidget = new QWidget(this);
        m_vLayout = new QVBoxLayout(this);
    
        m_mainWidget->setLayout(m_vLayout);
    
        for(int i = 0; i < 4; i++)
        {
            CustomButton* btn = new CustomButton(m_mainWidget);
            m_listCustomBtn.append(btn);
    
            m_vLayout->addWidget(btn);
        }
    
        setCentralWidget(m_mainWidget);
    }
    
    MainWindow::~MainWindow()
    {
    }
    

    CustomButton.h :

    #ifndef CUSTOMBUTTON_H
    #define CUSTOMBUTTON_H
    
    #include <QObject>
    #include <QPushButton>
    
    class CustomButton : public QPushButton
    {
        Q_OBJECT
    
    public:
        CustomButton(QWidget *parent = nullptr);
    
    private:
    
        QPushButton m_QPushButtonBoutton;
    };
    
    #endif // CUSTOMBUTTON_H
    

    CustomWindow.cpp :

    #include "custombutton.h"
    
    
    CustomButton::CustomButton(QWidget *parent)
        : m_QPushButtonBoutton(parent)
    {
        setText("toto");
    }
    

    J'aurais bien mis un spoiler pour mon code mais jsp comment faire


    Merci d'avance pour votre aide






    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2019 à 22:03:45

      Un schmilblick avec Ui::MainWindow peut être? tu mélanges le design automatique et le homemaid, en général ça ne se passe pas bien ;) soit tu passes en automatique avec Qt designer, soit tu fais tout à la main, mais le mélange c'est bof, bof, choisis ton camp camarade ^^.

      Perso, je fais tout à la main, je ne dis pas que c'est la meilleure façon de faire, c'est juste que j'ai appris comme ça et que ça va bien pour ce que je veux faire, je suis sûr que d'autres auront un avis différent sur le sujet...

      -
      Edité par int21h 15 juillet 2019 à 22:14:14

      • Partager sur Facebook
      • Partager sur Twitter
      Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
        16 juillet 2019 à 0:10:28

        m_vLayout = new QVBoxLayout(this);

        Quand tu passes un parent au constructeur du QLayout, donc ici, this, qui est le QMainWindow, setLayout est appelé automatiquement pour appliquer le layout sur le widget parent. C'est équivalent à:

        m_vLayout = new QVBoxLayout;
        this->setLayout(m_vLayout);

        Il aurait fallu écrire:

        m_vLayout = new QVBoxLayout(m_mainWidget);

        qui est équivalent à

        m_vLayout = new QVBoxLayout;
        m_mainWidget->setLayout(m_vLayout);

        Le setLayout qui suit dans le code, ligne 12, est donc superflu, si tu passes le parent au constructeur du layout.

        Et pour le(s) bouton(s) supplémentaire(s), ça vient du fait que tu as ajouté un membre QPushButton en trop dans ta classe CustomButton (qui est déjà un bouton, donc ce membre ne sert à rien), ce qui fait que tu crées un bouton supplémentaire, qui est ajouté au parent, mais pas au layout.

        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2019 à 16:10:29

          Ok merci, ça marche mieux maintenant.

          @int21h t'entends quoi par design auto vs homemaid ? Je commence juste avec QT, je précise, donc j'y connais pas grand chose...

          Edit:

          Bon, j'ai continué un peu, et je suis arrivé la :

          mainwinow.cpp :

          #include "mainwindow.h"
          #include "ui_mainwindow.h"
          
          MainWindow::MainWindow(QWidget *parent) :
              QMainWindow(parent)
          {
              setWindowTitle("Ceci est une super Application !");
          
              m_mainWidget = new QWidget(this);
          
          
              m_hLayout = new QHBoxLayout(m_mainWidget);
              m_vLayout = new QVBoxLayout(m_mainWidget); // ici je crois
          
              CustomButton* test = new CustomButton(m_mainWidget);
          
              connect(test, SIGNAL(clicked(bool)), this, SLOT(direBjr(bool)) );
          
              m_hLayout->addLayout(m_vLayout);
              m_hLayout->addWidget(test);
          
          
              for(int i = 0; i < 4; i++)
              {
                  CustomButton* btn = new CustomButton(m_mainWidget);
                  m_listCustomBtn.append(btn);
          
                  m_vLayout->addWidget(btn);
              }
          
              setCentralWidget(m_mainWidget);
          }
          
          MainWindow::~MainWindow()
          {
          }
          
          void MainWindow::direBjr(bool b)
          {
              qDebug() << "Bonjour toa";
          }
          

          et il me sort :

          QLayout: Attempting to add QLayout "" to QWidget "", which already has a layout

          mais a part ça, tout marche parfaitement donc bon...

          -
          Edité par Passworld_ 16 juillet 2019 à 17:06:02

          • Partager sur Facebook
          • Partager sur Twitter
            16 juillet 2019 à 17:57:08

            Comme tu ajoutes m_vLayout à un autre layout, tu peux ne pas spécifier de parent à la construction, pour éviter l'appel implicite à setLayout.

            m_vLayout = new QVBoxLayout;
            • Partager sur Facebook
            • Partager sur Twitter
              16 juillet 2019 à 18:08:36

              Et il faut mettre un delete ou pas ?
              • Partager sur Facebook
              • Partager sur Twitter
                17 juillet 2019 à 11:38:40

                Non, puisque tu l'ajoutes à un autre layout, c'est lui qui en devient propriétaire et qui va l'effacer.

                • Partager sur Facebook
                • Partager sur Twitter
                  17 juillet 2019 à 12:08:54

                  D'accord je comprends mieux, merci
                  • Partager sur Facebook
                  • Partager sur Twitter

                  QT / QLayout: Attempting to add QLayout "" to QMai

                  × 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