Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Modification du contenu de la fenêtre avec un slot personnalisé

    30 mars 2008 à 16:34:38

    Salut à tous,

    J'ai un petit souci concernant un code que j'essaie de faire pour l'instant.

    Voici un petit exposé de la situation :
    J'ai une fenêtre avec dedans un QComboBox qui contient ["1", "2", "3", "4"] qui représente le nombre de joueurs.
    J'écoute le signal activated() associé à cet objet et je le connecte à un slot de mon cru.

    Mon programme contient en outre un pointeur d'un pointeur de QLineEdit qui est en fait un tableau de taille dynamique (taille = nombres de joueurs) et qui contient donc pour chaque joueur un objet QLineEdit.

    Le premier est affiché dès le départ puisqu'au départ, il y a 1 seul joueur.

    Lorsque l'utilisateur modifie le nombre de joueur avec la QComboBox, mon slot est appelé.

    Dedans je recrée un tableau dynamique qui a la nouvelle taille. Je crée pour chaque ligne du tableau (exactement comme je l'avais fait directement pour une ligne au début du programme) un objet QLineEdit.

    Puis je supprime l'ancien tableau et je fais pointer mon pointeur vers le nouveau tableau.

    --

    Dans mon idée, ça devrait me réafficher le nombre voulu de QLineEdit dans la fenêtre mais ça fait juste disparaître le QLineEdit de départ (logique je supprime le pointeur).

    Donc ma question est assez simple finalement : pourquoi est-ce que ça ne fonctionne pas ? (en gras comme ça on le repère facilement dans le message).

    Voici MaFenetre.h
    1. #ifndef DEF_MAFENETRE
    2. #define DEF_MAFENETRE
    3. #include <QApplication>
    4. #include <QWidget>
    5. #include <QPushButton>
    6. #include <QMessageBox>
    7. #include <QInputDialog>
    8. #include <QPainter>
    9. #include <QLineEdit>
    10. #include <QComboBox>
    11. #include <QStringList>
    12. class MaFenetre : public QWidget {
    13.     Q_OBJECT
    14.     public:
    15.     MaFenetre();
    16.     public slots:
    17.     void changePlayerNumber(int);
    18.     protected:
    19.     void paintEvent(QPaintEvent *event);
    20.     private:
    21.     QPixmap background_image;
    22.     const int static m_window_width = 952;
    23.     const int static m_window_height = 714;
    24.     int m_player_nbr;
    25.     QLineEdit ** m_input_player_nicknames;
    26.     QComboBox * m_input_player_nbr;
    27. };
    28. #endif


    et MaFenetre.cpp
    1. #include "MaFenetre.h"
    2. MaFenetre::MaFenetre() : QWidget()
    3. {
    4.     setFixedSize(m_window_width, m_window_height);
    5.     background_image.load("./images/background.png");
    6.     m_player_nbr = 1;
    7.     m_input_player_nicknames = new QLineEdit * [m_player_nbr];
    8.     m_input_player_nicknames[0] = new QLineEdit(this);
    9.     m_input_player_nicknames[0]->move(200, 300);
    10.     m_input_player_nbr = new QComboBox(this);
    11.     QStringList players;
    12.     players << "1" << "2" << "3" << "4";
    13.     m_input_player_nbr->addItems(players);
    14.     QObject::connect(m_input_player_nbr, SIGNAL(activated(int)), this, SLOT(changePlayerNumber(int)));
    15. }
    16. void MaFenetre::paintEvent(QPaintEvent *event) {
    17.     QPixmap buffer(m_window_width, m_window_height);
    18.     QPainter painter(&buffer);
    19.         buffer.fill(Qt::white);
    20.         painter.drawPixmap(0, 0, background_image);
    21.     QPainter final(this);
    22.     final.drawPixmap(0,0, buffer);
    23. }
    24. void MaFenetre::changePlayerNumber(int index) {
    25.     int player_new_nbr = index + 1;
    26.     QLineEdit ** new_input_player_nicknames = new QLineEdit * [player_new_nbr];
    27.     for(int i = 0; i < player_new_nbr; i++) {
    28.         if(i < m_player_nbr) {
    29.             new_input_player_nicknames[i] = new QLineEdit(m_input_player_nicknames[i]->text(), this);
    30.         } else {
    31.             new_input_player_nicknames[i] = new QLineEdit(this);
    32.         }
    33.         new_input_player_nicknames[i]->move(200, 200 + (i * 20));
    34.     }
    35.     for(int i = 0; i < m_player_nbr; i++) {
    36.         delete m_input_player_nicknames[i];
    37.     }
    38.     delete[] m_input_player_nicknames;
    39.     m_input_player_nicknames = new_input_player_nicknames;
    40. }


    J'ai vraiment aucune idée et toute aide sera franchement appréciée ;)

    Merci,
    @micalement,
    `ixM
    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2008 à 17:09:24

      il faut jouer avec les layouts.
      dans ton slot tu crées un layout (probablement un QVBoxLayout), tu rajoutes les champs nouvellement crées et tu fais :
      1. setLayout(ton_layout);

      (code non testé et fourni sans aucune garantie ^^ )
      • Partager sur Facebook
      • Partager sur Twitter
        30 mars 2008 à 17:30:41

        Ok, je pensais utiliser les layout mais je voulais d'abord arriver à faire le truc sans.

        J'essaie encore autre chose et puis ça je le ferai de toute façon.

        Je mettrai en résolu lorsque j'aurai quelque chose de concret à poster ;)

        Merci
        • Partager sur Facebook
        • Partager sur Twitter

        [Qt] Modification du contenu de la fenêtre avec un slot personnalisé

        × 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