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 :

Afficher un bouton d'une classe dans une fenêtre d'une autre classe

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Afficher un bouton d'une classe dans une fenêtre d'une autre classe
    Bonjour.
    Je voudrais savoir comment afficher le bouton d'une classe, dans la fenêtre d'une autre classe. Ci joint le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <QtGui/QApplication>
    #include "mafen.h"
     
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
        MaFen maFen;
     
        maFen.show();
     
        return app.exec();
    }
    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
     
    #ifndef MAFEN_H
    #define MAFEN_H
     
    #include <QWidget>
    #include "affichage.h"
     
    class MaFen : public QWidget {
        Q_OBJECT
     
    public:
      MaFen(QWidget *parent= 0);
     
    public:
      Affichage m_aff;
    };
     
    #endif // MAFEN_H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "mafen.h"
     
    MaFen::MaFen(QWidget *parent) : QWidget(parent) {
      m_aff.afficher();
    }
    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
     
    #ifndef AFFICHAGE_H
    #define AFFICHAGE_H
     
    #include <QWidget>
    #include <QPushButton>
     
    class Affichage : public QWidget {
        Q_OBJECT
     
    public:
      Affichage(QWidget *parent= 0);
      void afficher(void);
     
    private:
        QPushButton *m_bp;
    };
     
    #endif // AFFICHAGE_H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "affichage.h"
     
    Affichage::Affichage(QWidget *parent) : QWidget(parent) {
      m_bp = new QPushButton("Test", parent);
      afficher();
    }
     
    void Affichage::afficher(void) {
      m_bp->show();
    }
    Actuellement avec ce code j'ai deux fenêtres, une fenêtre principale et une fenêtre avec le bouton. Moi je voudrais le bouton dans la fenêtre principale.
    Je débute avec Qt et j'ai un peu de mal.
    Merci.

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

    Il me semble avoir compris ton problème.
    En fait quand tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MaFen : public QWidget {
        Q_OBJECT
     
    public:
      MaFen(QWidget *parent= 0);
     
    private:
      Affichage m_aff;
    };
    (Déjà peut-être une petite erreur : il faut déclarer m_aff en private mais je me doute que c'est une simple erreur de frappe).
    Quand dans la fonction main() tu appelles le constructeur de ta classe MaFen, il crée un objet de type/classe Affichage : ici l'objet m_aff qui contient le bouton en question (comme tu l'as spécifié dans le constructeur de la classe Affichage).
    Dis-moi si je me trompe mais tu devrais avoir une fenêtre principale vide sans bouton et une 2ème fenêtre avec le bouton alors que toi tu veux la même chose : les 2 fenêtres mais avec le bouton dans la fenêtre principale MaFen c'est ça ?

    En gros je pense que ce qui se passe dans la fonction main() c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(int argc, char *argv[])
     {
        QApplication app(argc, argv);
        MaFen maFen; // tu crées ta fenêtre principale qui crée à son tour la 2ème fenêtre Affichage avec bouton comme tu l'as spécifié dans cette dernière classe et son constructeur
        maFen.show(); 
        return app.exec();
    }
    Je t'ai donné une piste : dis-moi si tu veux en savoir plus.

    Bonne journée. Cordialement, Gizmo.
    Dernière modification par Invité ; 14/09/2011 à 12h31.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Bonjour et merci d'avoir répondu.
    Tout d'abord le "private", effectivement était une erreur.
    Puis tu as tout à fait compris mon problème. Je ne veux, que la fenêtre principale avec le bouton, dedans. J'ai lu et relu votre message et je ne vois pas la piste!
    Je dois être aveugle. Sauf si tu insinues qu'il faille passer l'adresse de la classe Affichage dans MaFen. Avec la classe Affichage instanciée dans le main ?
    J'avoue ne pas tout saisir.
    D'après la doc Qt le parent passé au constructeur doit être différent de 0 pour ne pas être dans une fenêtre autonome ? Enfin bref j'ai essayé plein de manière et soit ça ne compile pas, soit ça ne fait rien...
    Désolé de te solliciter à nouveau car je n'avance pas.
    Je sens que c'est tout simple mais je n'arrive pas à le voir.
    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour à toi,

    Reprenons l'exemple avec ton constructeur MaFen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFen(QWidget *parent= 0);
    Dans la classe quand tu déclares le constructeur MaFen : si lorsque tu appelle le constructeur tu ne spécifies aucun objet parent, alors il n'y aura aucun parent. Plus précisément lorsque tu écris cette ligne ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFen(QWidget *parent= 0);
    En gros ça veut dire que tu crées un pointeur parent à l'appel du constructeur : si lors de cet appel (dans la fonction main()) tu ne mets rien (c'est ton cas ici) alors le pointeur "sera 0" : ça veut dire qu'il ne pointera vers rien et donc que ta fenêtre principale MaFen n'aura pas de parent.

    Alors pour ce qui est de ton problème, tu dois créer le pointeur vers ton bouton dans ta classe MaFen en private comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MaFen : public QWidget {
        Q_OBJECT
     
    public:
      MaFen(QWidget *parent= 0);
     
    private:
      Affichage m_aff;
      QPushButton *m_bp;  
    };
    Et créer ton objet dans le constructeur de ta classe MaFen avec new comme tu as fait déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaFen::MaFen(QWidget *parent) : QWidget(parent) {
      m_aff.afficher();
      m_bp = new QPushButton("Test", this);
    }
    Ici this est un pointeur vers l'objet instancié de type/classe MaFen
    Ici on crée un nouvel objet m_bp et on lui spécifie que ta fenêtre de type/classe MaFen est parent de ton pushbutton : cela signifie que tu n'as pas besoin de faire delete à la fermeture de ton programme car si le parent est détruit il détruit automatiquement tous ses enfants.

    Est-ce ça va un peu mieux ?
    Cordialement, Gizmo.
    Dernière modification par Invité ; 16/09/2011 à 09h08.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Merci
    Bonsoir. Désolé de t'avoir fait travailler pour rien. Enfin ca servira au autre. En effet j'avais trouvé la solution celle que tu donnes. Donc merci quand même.
    Bonne soirée et peut être à bientôt pour d'autres questions.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    Content pour toi que ça marche
    Petite chose : tu n'est pas obligé de m'envoyer un message privé à chaque fois que tu postes en public, surtout si les 2 messages sont identiques
    Par contre je n'ai pas compris pourquoi tu m'as demandé alors que tu connaissais déjà la solution ? Tu as posté et replongé dedans après peut-être...

    Peu importe.

    Si tu veux tu peux jeter un coup d'oeil à la F.A.Q pour :
    => le pointeur this

    => un new sans delete

    Et aussi : la F.A.Q Qt : tu n'auras pas besoin de tout mais ça peut dépanner (moi ça m'a servi plus d'une fois)

    Voilà en te souhaitant bonne continuation. Cordialement, Gizmo.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/11/2014, 16h44
  2. Réponses: 2
    Dernier message: 23/05/2010, 12h45
  3. [Joomla!] appel de fonction d'une autre classe dans un autre fichier
    Par lkryss dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/07/2007, 16h55
  4. Comment afficher une valeur dans un edittext avec un autre programme
    Par pitizone dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 14/05/2007, 07h45
  5. passer une fonction dans un parametre d'une propriété de classe
    Par CAML dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 06/08/2006, 19h52

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