Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer un tableau de QPushButton

    19 mai 2019 à 22:57:02

    Bonjour a tous;

    Je souhaiterais créer un tableau de QPushButton, et ajouter chaque uns de ces boutons a un layout. Voici mon code, qui ne fonctionne pas:

    #include "fenetrePrincipale.h"
    using namespace std;
    FenetrePrincipale::FenetrePrincipale()
    {
        QTabWidget *zoneCentrale=new QTabWidget;
        QWidget *page1=new QWidget;
        QWidget *page2=new QWidget;
        QGridLayout *layPage1 = new QGridLayout;
        vector<vector<QPushButton>>map(20,vector<QPushButton>(15));
        for(int numLigne=0;numLigne<15;numLigne++)
        {
            for(int numCol=0;numCol<20;numCol++)
            {
                map[numLigne][numCol].setText("salut");
                layPage1->addWidget(map[numLigne][numCol],numLigne,numCol);
            }
        }
        page1->setLayout(layPage1);
        zoneCentrale->addTab(page1,"the king");
        zoneCentrale->addTab(page2,"Moi");
        setCentralWidget(zoneCentrale);
    }
    


    Auriez vous des idees?

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2019 à 0:56:29

      Tu peux nous donner ce que t'as en ouput de compilation ?
      • Partager sur Facebook
      • Partager sur Twitter
        20 mai 2019 à 18:14:04

        Voici ma sortie:

        -
        Edité par PieWar 20 mai 2019 à 18:15:02

        • Partager sur Facebook
        • Partager sur Twitter
          25 mai 2019 à 0:21:29

          Il te faut un vector de pointeurs.

          D'abord une petite classe pour gérer le tableau 2D, l'idée c'est la linéarisation, plutôt que de faire un vector<vector>> lourdingue, je range les lignes les unes derrières les autres dans un tableau 1D dont la taille est nombre de lignes * nombre de colonnes. J'en fais un template, parce que cette technique de linéarisation est particulièrement intéressante notamment parce qu'elle garantit la contiguïté en mémoire, qui permet d'exploiter à fond la mémoire cache des processeurs, et donc d'avoir des perfs sympa à peu de frais ^^ Le template est intéressant parce tu pourras y stocker presque n'importe quoi.

          template<class T>
          class Array2D
          {
          public:
          
              Array2D(std::size_t r,std::size_t c)
          		:rows_{r}
          		,cols_{c}
          		,content_(r*c,T{})
              {}
          	
          	
              std::size_t rows() const {return rows_;}
              std::size_t columns() const {return cols_;}
          	
              T const & operator()(std::size_t x,std::size_t y) const {return content_[get(x,y)];}
              T & operator()(std::size_t x,std::size_t y) {return content_[get(x,y)];}
          	
          private:
          
              size_t get(std::size_t x,std::size_t y) const {return x * cols_ + y;}
          	
              std::size_t rows_;
              std::size_t cols_;
              std::vector<T> content_;
          };
          

          Comment j'utilise ça ?

          Très simplement

          using ButtonMap = Array2D<QPushButton*>;
          
          ButtonMap map{15,20};
          for(auto i = 0u ; i < map.rows() ; ++i){
             for(auto j = 0u ; j < map.columns() ; ++j){
                map(i,j) = new QPushButton{"Salut",this};
                layPage1->addWidget(map(i,j),i,j);
             }
          }
          

          Tu remarqueras, que je passe this au constructeur de QPushButton, c'est pour laisser à Qt le soin de gérer la mémoire des QPushButton, j'utilise le système Parent/Enfant de Qt.

          • 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
            25 mai 2019 à 16:21:54

            Merci pour ta réponse, cependant je n'ais pas fini le cours sur le C++, et les fonctions que tu utilises me sont inconnues! Je regarderais dans un ou deux mois quand j'aurais fini le cours!
            • Partager sur Facebook
            • Partager sur Twitter
              25 mai 2019 à 17:48:45

              Si tu suis le cours de ce site, je te conseille vivement d'en changer, en plus d'être obsolète, il est farci d'erreurs. Pour des "cours" en lignes, tu en as deux corrects en français, celui de gbdivers qui traîne souvent par ici (il a mis un lien vers son blog dans sa signature) et celui de Zeste De Savoir. Les deux sont encore en cours d'écriture donc ils sont incomplets mais c'est du C++ moderne et c'est carré. Si tu veux vraiment un bon cours complet, je te conseille le C++ Primer 5Th Edition de Stanley Lippman, c'est un bouquin, en anglais, il commence à dater un peu mais la plupart des programmeurs C++ expérimentés sont d'accord sur le fait que c'est le meilleur cours de C++ disponible.

              -
              Edité par int21h 25 mai 2019 à 17:49:54

              • 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

              Créer un tableau de QPushButton

              × 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