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 une classe qui contient plusieurs boutons

  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 une classe qui contient plusieurs boutons
    Bonjour,

    Une fois de plus je viens vous demandez votre aide précieuse car je bloque.

    Dans mon programme j'ai un QLCDNumber qui s'incrémente et se décrémente à l'aide de deux boutons "+" et "-". Et un bouton "Add" qui permettais jusque la de créer un nombre de (nouveaux) boutons équivalent a la valeur du LCD.
    Nom : Screen Shot 2014-11-29 at 11.09.47.png
Affichages : 386
Taille : 13,8 Ko

    Les boutons créer bénéficie d'un nom différent grave a un slots "create fonction" qui fonctionne comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void MaFenetre::createbutton()
    {
     
     
     
            for(int i = count; i < count + m_lcd->value(); i++){
                QPushButton *m_button = new QPushButton(tr("video %1").arg(i+1));
                m_layout->addWidget(m_button);
            }
            count += m_lcd->value();
     
    }
    Mon but est de pouvoir créer une classe dans laquelle il y a deux boutons et une QCombobox (voire plus) qui seront créer a chaque clic du bouton "Add" et qui créera autant d'object que la valeur du QLCD. Mais surtout que le nom de mon premier bouton puisse s'incrementer comme avec la methode create buttons.

    Je vous mets dessous les code de MaFenetre et de Video seulement.

    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
    #ifndef MAFENETRE_H
    #define MAFENETRE_H
    #include <QApplication>
    #include <QWidget>
    #include <QtWidgets>
    #include <QPushButton>
    #include <QLCDNumber>
    #include <QGridLayout>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include "MyLCD.h"
    #include "Video.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;
    QVBoxLayout *m_layout;
    MyLCD *m_lcd;
    Video *m_video;
    int count;
     
     
     
    };
     
     
     
     
     
    #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
    56
    57
    #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 QVBoxLayout;
     
    // Layout principal
     
    m_principallayout = new QVBoxLayout;
    m_principallayout->addLayout(m_toplayout);
    m_principallayout->addLayout(m_layout);
     
    setLayout(m_principallayout);
     
     
     
    QWidget::connect(m_minusbutton, SIGNAL(clicked()), m_lcd, SLOT(decrement()));
    QWidget::connect(m_plusbutton, SIGNAL(clicked()), m_lcd, SLOT(increment()));
    QWidget::connect(m_addbuttonListener, SIGNAL(clicked()), this, SLOT(createbutton()));
    }
     
    // Méthode creation des boutons "video"
     
     
    void MaFenetre::createbutton()
    {
     
     
            for(int i = count; i < count + m_lcd->value(); i++){
                Video *m_video = new Video(count);
                m_layout->addWidget(m_video);
            }
            count += m_lcd->value();
     
    }
    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
    #ifndef VIDEO_H
    #define VIDEO_H
    #include <QApplication>
    #include <QWidget>
    #include <QHBoxLayout>
    #include <QPushButton>
    #include <QComboBox>
    #include <QGridLayout>
    #include <QFileDialog>
    #include "MyLCD.h"
     
    class Video : public QWidget // On hérite de QWidget (IMPORTANT)
    {
    Q_OBJECT
     
    public:
     
    Video(QWidget* parent=0);
    Video(int videoname);
     
     
     
    private:
     
     
    QPushButton *m_buttonvideo;
    QPushButton *m_buttonload;
    QHBoxLayout *m_buttonvideolayout;
    QComboBox *m_midinotelist;
    int m_videoname;
    int count;
     
     
    //int count;
     
     
     
    };
    #endif // VIDEO_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
    #include "Video.h"
    #include <iostream>
     
     
    using namespace std;
     
    Video::Video(QWidget* parent) : QWidget(parent)
    {
     
    }
     
    Video::Video(int videoname) : m_videoname(videoname)
    {
     
        // Construction des boutons
     
     
          m_buttonvideo = new QPushButton(tr("video %1").arg(videoname+1));
          m_buttonload = new QPushButton("Load");
     
        m_midinotelist= new QComboBox();
          m_midinotelist->addItem("C1");
          m_midinotelist->addItem("C2");
          m_midinotelist->addItem("C3");
          m_midinotelist->addItem("C4");
          QString dossier = QFileDialog::getExistingDirectory(this);
     
     
     
     
        // Création des layouts
     
          m_buttonvideolayout = new QHBoxLayout;
          m_buttonvideolayout->addWidget(m_buttonvideo);
          m_buttonvideolayout->addWidget(m_buttonload);
          //m_buttonvideolayout->addWidget(m_midinotelist,1,0);
     
          setLayout(m_buttonvideolayout);
     
     
    }
    Ici le probléme est que si je veux des boutons video qui se suivent video 1, video 2, video 3 etc.. je dois les créer un par un, forcement si j'en créé deux d'un coup ils porteront le même nom c'est à dire "video 1". Comment puis je faire pour que l'incrémentation du nom de mes boutons s'effectue correctement au seins de leur classe vidéo, alors que les valeur du LCD sont dans une autre classe. il y a t'il moyen de communiquer entre classe ? je suppose que oui, mais je ne trouve pas comment faire correctement.

    Merci d'avance pour votre aide

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

    Si je te suis bien rien ne change par rapport à l'autre discussion, y compris la variable utilisée pour le nombre affiché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Video *m_video = new Video(i); // i et non count
    count est fixe tout au long de la boucle for. C'est i qui varie entre count et count + m_lcd->value()-1.

    PS : tu as beaucoup trop d'#include dans tes en-têtes. Je t'invite à lire ces trois billets pour apprendre à bien les utiliser :

  3. #3
    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 j'étais pas loin. Merci beaucoup.

    Ma manière de procédé est elle la bonne pour ce cas de figure la. Ou je fais des erreurs et il y a une méthode plus approprié ?

    Encore merci, pour la solution et les liens

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui, elle est tout à fait correcte.
    J'aurais juste à critiquer l'indentation de ton code.

  5. #5
    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 cool.

    Oui je sais je vais corriger tout ca.

    Merci encore.

    (je fais finir par te considérer comme mon mentor a force que tu m'aide comme ca )

  6. #6
    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
    Re bonjour

    Encore moi

    Jusqu'à présent je compilé ce programme sous mac, maintenant que je suis passé sous PC, tout marche normalement sauf le nom des boutons Video :

    Nom : Capture d'écran 2014-11-30 01.49.26.png
Affichages : 395
Taille : 6,6 Ko

    J'ai imprimer la valeur des variables pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void MaFenetre::createbutton()
    {
     
     
            for(int i = count; i < count + m_lcd->value(); i++){
                Video *m_video = new Video(i);
                m_layout->addWidget(m_video);
                cout <<"i ="<<  i << endl;
                cout <<"cout ="<< count << endl;
                cout <<"m_lcd->value() ="<< m_lcd->value() << endl;
            }
            count += m_lcd->value();
     
    }
    i =13845391
    cout =13845391
    m_lcd->value() =2
    ...

    D'ou cela vient il ? Une erreur de conversion ?

    Merci d'avance

    //EDIT

    j'ai réussi à régler le problème en instanciant à 1 la variable count dans le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MaFenetre::MaFenetre() : QWidget()
    {
     
        count = 1;
    ...
    ...
    }
    Est ce cela qu'il faut faire ?

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 585
    Points
    188 585
    Par défaut
    Citation Envoyé par alaskabender Voir le message
    Est ce cela qu'il faut faire ?
    Sur le principe, oui : si tu ne mets pas une valeur dans une variable avant de l'utiliser, tu n'as aucune garantie sur son contenu. D'ailleurs, si tu te laisses aller à ce genre de tourments en Java, le compilateur gueulera fort (en C et C++, par contre, il faut bien arriver à coder des exploits de sécurité ). Sur la syntaxe C++, il est plus courant d'utiliser une liste d'initialisation dans ce genre de cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFenetre::MaFenetre(): QWidget(), count(1) {}
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

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

Discussions similaires

  1. image dans une image qui contient un bouton image
    Par ChTiRiBi dans le forum JSF
    Réponses: 6
    Dernier message: 12/04/2010, 10h17
  2. éxecuter une classe qui contient une classe annonyme
    Par star-watcher dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 09/03/2009, 01h26
  3. Réponses: 1
    Dernier message: 28/12/2007, 12h14
  4. Créer une feuille qui contient une seule page seulement
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/05/2007, 17h38
  5. [VBA-E]Créer une feuille qui contient du code
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 04/04/2006, 15h58

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