IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Créer des boutons en cliquant sur un autre bouton

  1. #1
    Membre à l'essai
    Homme Profil pro
    technicien du son
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien du son

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut Créer des boutons en cliquant sur un autre bouton
    Bonjour,

    Je débute en C++ et Qt et ceci est ma deuxième demande d'aide ici. Je remercie encore une fois la personne qui m'a aidé à régler mon premier problème.

    Mon problème actuel est le suivant :

    J'ai une fenêtre dans laquelle j'ai un QLCDNumber que j'incrémente et décrémente avec deux boutons, et un bouton add qui me permet d'ajouter, un nouveau bouton à chaque click dessus.

    J'aimerais pouvoir créer des boutons différent a chaque click, libellé, "Video1", "Video2", "Video..." avec donc a chaque fois une adresse de variable différente.

    Et également créer un nombre de bouton qui correspond à la valeur du QLCDNumber.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    //MaFenetre.h
     
    #ifndef MAFENETRE_H
    #define MAFENETRE_H
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QLCDNumber>
    #include <QGridLayout>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include "MyLCD.h"
     
    class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
    {
    Q_OBJECT
     
    public:
     
    MaFenetre();
     
    public slots:
     
    void createbutton();
     
    private:
     
    QPushButton *m_minusbutton;
    QPushButton *m_plusbutton;
    QPushButton *m_addbuttonListener;
    QHBoxLayout *m_toplayout;
    QVBoxLayout *m_principallayout;
    QHBoxLayout *m_layout;
    MyLCD *m_lcd;
     
     
    };
     
     
     
     
     
    #endif // MAFENETRE_H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    //MaFenetre.cpp
     
    #include "MaFenetre.h"
    #include <iostream>
     
     
    using namespace std;
    MaFenetre::MaFenetre() : QWidget()
    {
     
    // Construction des boutons
     
    m_minusbutton = new QPushButton("-", this);
    m_lcd = new MyLCD();
    m_plusbutton = new QPushButton("+", this);
    m_addbuttonListener = new QPushButton("add", this);
     
    // Création des layouts
     
    // Layout menu
    m_toplayout = new QHBoxLayout;
    m_toplayout->addWidget(m_minusbutton);
    m_toplayout->addWidget(m_lcd);
    m_toplayout->addWidget(m_plusbutton);
    m_toplayout->addWidget(m_addbuttonListener);
     
    // Layout bouton "video"
     
    m_layout = new QHBoxLayout;
     
    // Layout principal
     
    m_principallayout = new QVBoxLayout;
    m_principallayout->addLayout(m_toplayout);
    m_principallayout->addLayout(m_layout);
     
    setLayout(m_principallayout);
     
     
    connect(m_minusbutton, SIGNAL(clicked()), m_lcd, SLOT(decrement()));
    connect(m_plusbutton, SIGNAL(clicked()), m_lcd, SLOT(increment()));
    connect(m_addbuttonListener, SIGNAL(clicked()), this, SLOT(createbutton()));
    }
     
    // Méthode creation des boutons video
     
    void MaFenetre::createbutton()
    {
     
    QPushButton *m_button = new QPushButton("video", this);
     
    m_layout->addWidget(m_button);
     
    }
    Merci d'avance pour toute réponse.

  2. #2
    Membre à l'essai
    Homme Profil pro
    technicien du son
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien du son

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Bonjour,
    Le problème du QLCDNumber n'est pas important. Ce qui m'intéresse le plus c'est de pouvoir créer des bouton dont le nom et la "valeur" s'incrémente.
    Je sais pas trop quoi faire. Quelqu'un pourrais m'aider.
    Merci d'avance.

  3. #3
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    Si j'ai bien compris ton problème , tu peux créer une classe bouton et dans ton classe principale tu fait une boucle en fonction du nombre de boutons que tu veux créer et tu auto incrémente chaque boutons

  4. #4
    Membre à l'essai
    Homme Profil pro
    technicien du son
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien du son

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Je fais genre une boucle for avec un tableau qui incrementera le nom de mes boutons ?

    Cela va t'il créer des boutons différents ? Cad independant.

    Mon but et de créer plusieurs object dans lequel il y aura 2 boutons, un qui load (va chercher l'adresse) une vidéo et un bouton play qui lancera la vidéo. Il fait donc que chaque boutons soit unique en gros

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si je comprends bien le problème ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QPushButton *m_button = new QPushButton( QString("Video%1").arg(count++) );
    m_layout->addWidget(m_button);
    avec int count; membre de la classe.
    Dernière modification par Invité ; 25/11/2014 à 18h01.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Je pense que la solution est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Méthode creation des boutons video 
    void MaFenetre::createbutton()
    { 
        for(int i = 0; i < m_lcd->value(); i++){
            //Il n'y a pas besoin de donner "this" comme parent à ce bouton, en effet lorsque on l'ajoute
            //un widget dans un layout, ce dernier devient automatiquement le parent du widget. 
            QPushButton *m_button = new QPushButton(tr("video%1").arg(i)); 
            m_layout->addWidget(m_button);
        }
     
    }
    Attention par contre, si le bouton est cliqué 2 fois, les boutons apparaîtront à double. A moins de supprimer les boutons du layout au début de la fonction void MaFenetre::createbutton()

  7. #7
    Membre à l'essai
    Homme Profil pro
    technicien du son
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien du son

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci énormément pour les réponses.

    Attention par contre, si le bouton est cliqué 2 fois, les boutons apparaîtront à double. A moins de supprimer les boutons du layout au début de la fonction void MaFenetre::createbutton()
    Effectivement cela créer des doublons dans l'appellation des boutons. N'est il pas possible d'appuyer plusieurs fois sur le bouton et que le noms de boutons suivent. Genre je créé 2 premiers boutons video1 et video2 et puis en recrée deux après mais qui s'appellerais video3 et video4, en créant une variable globale qui se rappelle de la valeur du nombre de boutons créé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPushButton *m_button = new QPushButton(tr("video%1").arg(i));
    Pourriez vous m'expliquer a quoi correspond : "tr", "%1" et ".arg(i)

    Encore merci

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Citation Envoyé par alaskabender Voir le message
    Effectivement cela créer des doublons dans l'appellation des boutons. N'est il pas possible d'appuyer plusieurs fois sur le bouton et que le noms de boutons suivent. Genre je créé 2 premiers boutons video1 et video2 et puis en recrée deux après mais qui s'appellerais video3 et video4, en créant une variable globale qui se rappelle de la valeur du nombre de boutons créé ?
    Oui en reprenant le code précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void MaFenetre::MaFenetre() : 
        QMainWindow(parent)
    {
        count = 0;
    }
    void MaFenetre::createbutton()
    { 
        if(count >= m_lcd->value()) 
            return;
     
        //on pourrait aussi faire : 
        //    for(;count < m_lcd->value(); count++)
        // on économise une variable et on peut supprimer la dernière ligne de la fonction. 
        for(int i = count; i < m_lcd->value(); i++){
            QPushButton *m_button = new QPushButton(tr("video%1").arg(i)); 
            m_layout->addWidget(m_button);
        }
        count = m_lcd->value();
     
    }

    Citation Envoyé par alaskabender Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPushButton *m_button = new QPushButton(tr("video%1").arg(i));
    Pourriez vous m'expliquer a quoi correspond : "tr", "%1" et ".arg(i)
    QObject::tr est une fonction prévue pour l'internalisation. J'ai pris l'habitude de l'utiliser , même si je n'ai jamais traduits de programme, c'est une bonne habitude a prendre je pense. mais pas obligatoire. Pour plus de détails, je t'invite à suivre le lien sur la doc de Qt ou faire des recherches sur google concernant l'internalisation avec Qt.

    Mais dans notre cas, la seule chose à retenir est que cette fonction renvoi une QString, donc ces 2 codes sont équivalent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QString("This is a string");
    tr("This is a string");
    Conernant le "%1" et la fonction arg(). Il s'agit d'une fonctionnalité très pratique de la classe QString qui permet de remplacer le %n (ou n va de 1 à 9) avec une valeur passer en argument de la fonction arg().

    Par exemple, avec cette initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString string = QString("%1 + %2 = %3").arg(1).arg(2).arg(1 + 2)
    string contiendra:
    Après tu peux utiliser autre chose que des int, il y a plusieurs paramètre pour modifier l'aspect d'affichage (largeur minimum, caractère de remplissage, etc... il est aussi possible d'enchaîner jusqu'à neuf QString en argument de la fonction arg. Bref je te laisse regarder la doc à ce sujet pour plus de détails. Il doit aussi y avoir une version traduite en français sur ce site j'imagine.

  9. #9
    Membre à l'essai
    Homme Profil pro
    technicien du son
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien du son

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci infiniment pour ces réponses.

    Je commence a beaucoup mieux comprendre tout ça. Merci d'être d'être aussi réactif, c'est génial, ça me motive de plus en plus et j'aime de plus en plus le c++ du coup

  10. #10
    Membre à l'essai
    Homme Profil pro
    technicien du son
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien du son

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    J'ai toujours un petit problème.

    En fait la ce qu'il se passe c'est que quand j'incrémente mon LCD jusqu'a deux par exemple, il me crée deux boutons,Video 1 et Video 2, mais si je re clique sur le bouton Add il ne se passe rien, il faut que la valeur de mon LCD passe à 3 pour pouvoir créer un bouton Video 3.

    Ce que j'aimerait ce qu'une fois mes deux boutons créer si je re clique sur Add alors le que LCD est a 2 il recrée 2 autre boutons,Video 3 et Video 4. en gros qu'il créé a chaque fois le nombre de bouton correspond a la valeur du LCD.

    La comme count = MyLCD->value() forcement il est égal au nombre de bouton. Faut il créer une nouvelle variable qui se re initialise à 0 pour que le nombre de bouton a créer se re initialise mais que la valeur du nom des boutons garde la valeur de count. ?

    Merci d'avance.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Il suffit de modifier un peu l'utilisation de la variable count qui contiendra dorénavant le nombre de boutons total.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void MaFenetre::MaFenetre() : 
        QMainWindow(parent),
        count(0)
    { }
    void MaFenetre::createbutton()
    { 
        for(int i = count; i < count + m_lcd->value(); i++){
            QPushButton *m_button = new QPushButton(tr("video%1").arg(i)); 
            m_layout->addWidget(m_button);
        }
        count += m_lcd->value();
    }

  12. #12
    Membre à l'essai
    Homme Profil pro
    technicien du son
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : technicien du son

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Ah ouais, j'ai encore un peu du mal avec la logique de programmation, mais ca rentre doucement.

    En tout cas merci beaucoup encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer des champs par clic sur un bouton
    Par Grassii dans le forum JSF
    Réponses: 2
    Dernier message: 21/04/2015, 12h47
  2. Réponses: 6
    Dernier message: 01/03/2015, 16h52
  3. Rajouter des éléments en cliquant sur un bouton
    Par l0c0l0c0 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/12/2014, 13h52
  4. Créer un texte en cliquant sur des boutons.
    Par azmodai dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/02/2009, 19h13
  5. [PHP-JS] ajouter des champ en cliquant sur un bouton?
    Par einsteineuzzz dans le forum Langage
    Réponses: 3
    Dernier message: 29/06/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo