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

 C++ Discussion :

Exécuter une méthode parent depuis un enfant


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Par défaut Exécuter une méthode parent depuis un enfant
    Bonjours à tous

    Débutant en Qt et C++ je m'affronte à un problème de hiérarchie.

    Je m'explique :
    J'ai une classe parent (issue d'un QMainWindow) qui possède un 'public slot'
    la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class FenetreAppli : public QMainWindow
    le slot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void renameFile(QString leRep="", QString oldName="", QString newName="");
    qui se déclenche sur un item de menu (vous l'aurez compris, le but est de renommer un fichier,
    dont on passe le nom du dossier ainsi que l'ancien et nouveau nom, ou qui les demande s'ils ne sont pas transmis).

    Je créé un enfant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Editeur : public QWidget
    dont le constructeur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Editeur(QWidget *parent, QString nomRubDir);
    créé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           Editeur *fenEdit = new Editeur(m_zoneCentrale, nomRuban);
            QMdiSubWindow *sousFenetre1 = m_zoneCentrale->addSubWindow(fenEdit);
            sousFenetre1->show();
    (à savoir que m_zoneCentrale est un QMdiArea et nomRuban un éventuel nom de fichier).

    qui possède un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(rubanEditer, SIGNAL(triggered()), this, SLOT(editRub()));
    j'aimerais appeler le slot "renameFile" depuis le slot editRub() de ma classe 'Editeur'

    Hors 'Editeur' ne connait pas ce slot, même avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parent->renameFile(m_nomRep,m_nomRuban,nomRuban);
    Pouvez-vous m'aider pour appeler un slot (ou même une méthode 'public') depuis une classe enfant ?

    Merci d'avance
    Philippe

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Ton éditeur aura besoin d'une référence sur ta fenêtre.
    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
    class FenetreAppli : public QMainWindow {
       /* ... */
    public slot:
       void renameFile(QString leRep="", QString oldName="", QString newName="") { }
    };
     
    class Editeur : public QWidget {
       FenetreAppli &m_fen;
     
    private slot:
       editRub() {
           emit editedRub;
       }
     
    public signal:
       void editedRub();
       void triggered();
     
    public:
       Editeur(QWidget *parent, QString nomRubDir, FenetreAppli &fen) :
           QWidget(parent),
           /* ... */
           m_fen(fen)
       {
           connect(this, SIGNAL(triggered()), this, SLOT(editRub()));
           connect(this, SIGNAL(editedRub()), &m_fen, SLOT(renameFile());
       }
    };
     
    FenetreAppli *fen = new FenetreAppli( /*...*/ );
    Editeur *editeur = new Editeur(parent, QString(""), *fen);
    Quelque chose du genre devrait marcher.

    J'ai pas Qt sous la main pour tester, et ça fait plusieurs mois que j'y ai pas touché. Il y à probablement des erreurs de syntaxes.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Par défaut Exécuter une méthode parent depuis un enfant
    Bonjour Iradrille

    Merci pour ta réponse ( ... tardive ... je vois que tu n'es pas un couche-tôt )

    Je me suis servi de tes conseils, et après les avoir un peu adaptés, j'y suis arrivé

    Voici ce que j'ai écrit dans mon FenetreAppli.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
    #include "Editeur.h"
     
    class FenetreAppli : public QMainWindow
    {
    public:
        FenetreAppli();
    /* ... */
    public slots:
        void renameFile(QString leRep="", QString oldName="", QString newName="");
     
    private:
        QMdiArea *m_zoneCentrale;
    /* ... */
    };
    Voici ce que j'ai écrit dans mon FenetreAppli.cpp :
    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
    #include "FenetreAppli.h"
     
    FenetreAppli::FenetreAppli()
    {
        m_zoneCentrale = new QMdiArea;
    /* ... */
    }
     
    void FenetreAppli::renameFile(QString leRep, QString oldName, QString newName)
    {
    /* ... */
    }
     
     
    // lancement de l'editeur depuis FenetreAppli :
    Editeur *fenEdit = new Editeur(this, m_zoneCentrale, nomRuban);
    QMdiSubWindow *sousFenetre1 = m_zoneCentrale->addSubWindow(fenEdit);
    sousFenetre1->show();
    Voici ce que j'ai écrit dans mon Editeur.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Editeur : public QWidget
    {
    /* ... */
    public:
        Editeur(QMainWindow *fen, QWidget *parent =0, QString nomRubDir ="");
     
    public slots:
        void renommeRuban();
    signals:
        void renommeFichier(QString rep="", QString oldNom="", QString newNom="");
    /* ... */
    }
    Voici ce que j'ai écrit dans mon Editeur.cpp :
    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
    #include "Editeur.h"
     
    Editeur::Editeur(QMainWindow *fen, QWidget *parent, QString nomRubDir) :
        QWidget(parent), m_fenA(fen)
    {
     /* ... */
         QObject::connect(m_btnRenommeR, SIGNAL(clicked()), this, SLOT(renommeRuban()));
    	// m_btnRenommeR est un pointeur sur un QPushButton
        QObject::connect(this, SIGNAL(renommeFichier(QString, QString, QString)), m_fenA, SLOT(renameFile(QString, QString, QString)));
    /* ... */
     
    void Editeur::renommeRuban()
    {
    /* ... */
    	emit renommeFichier(m_nomRep, m_nomRuban, nouveauNom);
    	// m_nomRep et m_nomRuban sont des attributs et nouveauNom une variable renseignée précédemment
    /* ... */
    }
     
    }

    Le fonctionnement :
    FenetreAppli créé un Editeur dans une sous-fenêtre,
    lorsque le bouton de l'Editeur est cliqué, le slot de l'Editeur est appelé et déclenche son signal qui active le slot de FenetreAppli
    (dont le pointeur est passé en paramètre du constructeur de l'Editeur).

    Je n'ai pas passé une référence à FenetreAppli au constructeur de l'Editeur car il aurait fallut inclure FenetreAppli.h dans Editeur.h,
    hors FenetreAppli.h inclus déjà Editeur.h ..... inclusions en boucle .... ça me chagrine ...
    Mais vu que FenetreAppli est une classe dérivée d'un QMainWindow, je passe un pointeur de QMainWindow et hop ... le tour est joué.

    Merci beaucoup pour ton aide

    Je part à la conquète d'autres problèmes.

    Philippe

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

Discussions similaires

  1. Actualiser une div Parent depuis une IFRAME enfant ?
    Par Marmotton76 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2012, 12h45
  2. Réponses: 5
    Dernier message: 03/08/2011, 14h10
  3. acceder a une variable du parents depuis un enfant
    Par darkloy dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 25/05/2009, 01h09
  4. [C#] Exécuter une méthode apsx.cs depuis un ascx
    Par bendj dans le forum ASP.NET
    Réponses: 12
    Dernier message: 12/07/2005, 11h18

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